在每个 pandas 数据框行中查找前 n 个最高值列的名称

Posted

技术标签:

【中文标题】在每个 pandas 数据框行中查找前 n 个最高值列的名称【英文标题】:Find names of top-n highest-value columns in each pandas dataframe row 【发布时间】:2016-08-15 12:33:56 【问题描述】:

我有以下数据框:

  id     p1 p2 p3 p4
  1      0  9  1  4
  2      0  2  3  4
  3      1  3 10  7
  4      1  5  3  1
  5      2  3  7 10

我需要重塑数据框,使每个 id 都具有最高值的前 3 列。结果是这样的:

 id top1 top2 top3
  1  p2   p4   p3
  2  p4   p3   p2
  3  p3   p4   p2
  4  p2   p3   p4/p1
  5  p4   p3   p2

它显示了每个user_id 的前 3 名畅销书。我已经使用 R 中的 dplyr 包完成了它,但我正在寻找对应的 pandas。

【问题讨论】:

网站政策禁止 ping 特定用户,无论他们过去是否帮助过您。 【参考方案1】:

您可以使用np.argsort 来查找每行 n 个最大项目的索引:

import numpy as np
import pandas as pd

df = pd.DataFrame('id': [1, 2, 3, 4, 5],
 'p1': [0, 0, 1, 1, 2],
 'p2': [9, 2, 3, 5, 3],
 'p3': [1, 3, 10, 3, 7],
 'p4': [4, 4, 7, 1, 10])
df = df.set_index('id')

nlargest = 3
order = np.argsort(-df.values, axis=1)[:, :nlargest]
result = pd.DataFrame(df.columns[order], 
                      columns=['top'.format(i) for i in range(1, nlargest+1)],
                      index=df.index)

print(result)

产量

   top1 top2 top3
id               
1    p2   p4   p3
2    p4   p3   p2
3    p3   p4   p2
4    p2   p3   p1
5    p4   p3   p2

【讨论】:

可能是一些错字,因为输出与 OP 想要的不同。 @jezrael:我的错误。这里需要np.argsort,而不是np.argpartition。正在修复... 为什么df.columns,一个pd索引对象,可以使用数组作为索引?【参考方案2】:

你可以使用:

df = df.set_index('id').apply(lambda x: pd.Series(x.sort_values(ascending=False)
       .iloc[:3].index, 
      index=['top1','top2','top3']), axis=1).reset_index()
print (df)
   id top1 top2 top3
0   1   p2   p4   p3
1   2   p4   p3   p2
2   3   p3   p4   p2
3   4   p2   p3   p4
4   5   p4   p3   p2

【讨论】:

感谢您的宝贵时间。 希望你不要把它当成个人。你已经帮了我很多,我很感激

以上是关于在每个 pandas 数据框行中查找前 n 个最高值列的名称的主要内容,如果未能解决你的问题,请参考以下文章

根据“小时”日期时间选择 Pandas 数据框行

使用其他行中的值将函数应用于熊猫数据框行

检查列中的值是不是存在于数据框行中的其他位置

在 pandas 中将行中的最大值设置为 1,其余设置为 0

以整数形式获取 pandas 数据框行的索引

Pandas 在组和支点报告中排名前 n