1

我有一个用户定义的函数如下: -

def genre(option,option_type,*limit):
    option_based = rank_data.loc[rank_data[option] == option_type]
    top_option_based  = option_based[:limit]
    print(top_option_based)
    top_option_based.to_csv('top_option_based.csv')
    return(top_option_based))  

请参考这张图片

当我使用该功能时

genre('genre','Crime',2)

我收到一个错误

TypeError: cannot do slice indexing on <class 'pandas.indexes.numeric.Int64Index'> with these indexers [(2,)] of <class 'tuple'>".
4

2 回答 2

1

考虑数据框rank_data

rank_data = pd.DataFrame(dict(
        genre=['Crime'] * 4 + ['Romance'] * 4
    ))

print(rank_data)

     genre
0    Crime
1    Crime
2    Crime
3    Crime
4  Romance
5  Romance
6  Romance
7  Romance

我将假设您想要获取切片的第二个元素,因为您将 a 传递2给您的函数。在这种情况下,我将假设您想要使用iloc并跳过前面的:.

此外,解包*limit返回一个元组,我们需要一个列表。

def genre(option,option_type,*limit):
    option_based = rank_data.loc[rank_data[option] == option_type]
    top_option_based  = option_based.iloc[list(limit)]
               # I changed this bit  ^^^^^^^^^^^^^^^^^
    top_option_based.to_csv('top_option_based.csv')
    return(top_option_based)

genre('genre', 'Crime', 2)

   genre
2  Crime

genre('genre', 'Crime', 2, 3)

   genre
2  Crime
3  Crime
于 2017-03-15T08:54:39.603 回答
1

我认为您需要**limitif 参数limit中删除integerand rank_data

def genre(option,option_type,limit):
    option_based = rank_data.loc[rank_data[option] == option_type]
    top_option_based  = option_based[:limit]
    print(top_option_based)
    top_option_based.to_csv('top_option_based.csv')
    return(top_option_based)

借用另一个答案的样本,它可以完美地工作:

def genre(option,option_type,limit):
    option_based = rank_data.loc[rank_data[option] == option_type]
    top_option_based  = option_based[:limit]
    print(top_option_based)
    top_option_based.to_csv('top_option_based.csv')
    return(top_option_based)

print (genre('genre', 'Crime', 2))
   genre
0  Crime
1  Crime

编辑:

我认为您也需要添加dataframe为参数:

def genre(rank_data, option,option_type,limit):
    option_based = rank_data.loc[rank_data[option] == option_type]
    top_option_based  = option_based[:limit]
    print(top_option_based)
    top_option_based.to_csv('top_option_based.csv')
    return(top_option_based)

print (genre(rank_data, 'genre', 'Crime', 2))
   genre
0  Crime
1  Crime
于 2017-03-15T08:48:21.917 回答