返回行中的最大值

时间:2018-07-26 14:58:07

标签: python pandas dataframe

我有一个带有%值的数据框。我想编写一个函数,以返回每行最高%的方式连续返回列的名称。例如:

输入数据框:

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个行和列,因为数据帧会定期更新/附加。有什么想法/内置功能可以在某种程度上做到这一点?像逐行的降序方法一样?

2 个答案:

答案 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)

meltpivot一起使用

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