我有一个带有%值的数据框。我想编写一个函数,以返回每行最高%的方式连续返回列的名称。例如:
输入数据框:
Customer ID Grapes Oranges Apples Bananas
12345 12.131 39.123 97.847 18.442
67890 11.111 1.111 100.000 40.941
输出数据框:
Customer ID Rec 1 Rec 2 Rec 3 Rec 4 ...
12345 Apples Oranges Bananas Grapes
67890 Apples Bananas Grapes Oranges
...
我希望此函数可用于N个行和列,因为数据帧会定期更新/附加。有什么想法/内置功能可以在某种程度上做到这一点?像逐行的降序方法一样?
答案 0 :(得分:3)
如果性能很重要,请使用numpy.argsort
:
N = 4
df = df.set_index('Customer ID')
df1 = pd.DataFrame(df.columns[np.argsort(-df.values, axis=1)[:, :N]],
index=df.index)
df1 = df1.rename(columns=lambda x: 'Rec {}'.format(x + 1))
print (df1)
Rec 1 Rec 2 Rec 3 Rec 4
Customer ID
12345 Apples Oranges Bananas Grapes
67890 Apples Bananas Grapes Oranges
N = 2
df = df.set_index('Customer ID')
df1 = pd.DataFrame(df.columns[np.argsort(-df.values, axis=1)[:, :N]],
index=df.index)
df1 = df1.rename(columns=lambda x: 'Rec {}'.format(x + 1))
print (df1)
Rec 1 Rec 2
Customer ID
12345 Apples Oranges
67890 Apples Bananas
详细信息:
print ((np.argsort(-df.values, axis=1)[:, :N]))
[[2 1 3 0]
[2 3 0 1]]
print (df.columns[np.argsort(-df.values, axis=1)[:, :N]])
Index([['Apples', 'Oranges', 'Bananas', 'Grapes'],
['Apples', 'Bananas', 'Grapes', 'Oranges']], dtype='object')
答案 1 :(得分:2)
将melt
与pivot
一起使用
newdf=df.melt('CustomerID').sort_values(['value'],ascending=False)
newdf.assign(key=newdf.groupby(['CustomerID']).cumcount()+1).pivot(index='CustomerID',columns='key',values='variable')
Out[96]:
key 1 2 3 4
CustomerID
12345 Apples Oranges Bananas Grapes
67890 Apples Bananas Grapes Oranges