【问题标题】:Returning highest values in row返回行中的最大值
【发布时间】:2018-07-26 23:42:36
【问题描述】:

我有一个带有 % 值的数据框。我想编写一个函数,该函数连续返回每行最高百分比的列名。例如:

输入数据框:

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

【问题讨论】:

  • 你能把你迄今为止尝试过的代码包含进来吗?

标签: python pandas dataframe


【解决方案1】:

如果性能很重要,请使用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')

【讨论】:

  • 这个答案的唯一问题是列名 id 与所需输出相比移动了 1
  • 当然是关于 SO for pandas 的传说(Wen、jezrael 和 jpp):) 很高兴你们在这里,抱歉偏离主题的评论
  • @akashkarothiya 最糟糕的是,当你认为你有一个问题的答案,然后专业人士出现并完全粉碎它时。最好在中午(东部标准时间)左右等他们休息:)
  • @Yuca 哈哈,真的!!如果出现任何 pandas 问题,我会立即停止思考解决方案,因为我确定 Wen、jezrael 或 jpp 随时都会出现并确定
  • @Yuca - 特别为您重命名的列 ;)
【解决方案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

【讨论】:

  • 当然是关于 SO for pandas 的传说(Wen、jezrael 和 jpp):) 很高兴你们在这里,抱歉偏离主题的评论
  • @akashkarothiya 谢谢你,他们是 Jez、coldspeed 和 jpp 的传奇人物,我从他们身上学到了很多
  • 欢迎您 :) 现在我们正在向你们学习。干杯!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
相关资源
最近更新 更多