python - 返回行中 3 个最高值的列名称

标签 python pandas

我正在尝试想出一种方法来返回下表每行中 3 个最高值的列名称。到目前为止,我已经能够使用 idxmax 返回最高值,但我无法弄清楚如何获得第二和第三高值。

   Clust  Stat1    Stat2    Stat3    Stat4    Stat5    Stat6  
0  9      0.00     0.15     0.06     0.11     0.23     0.01    
1  4      0.00     0.25     0.04     0.10     0.10     0.00    
2  11     0.00     0.34     0.00     0.09     0.24     0.00     
3  12     0.00     0.16     0.00     0.11     0.00     0.00       
4  0      0.00     0.35     0.00     0.04     0.02     0.00     
5  17     0.01     0.21     0.02     0.18     0.27     0.01 

预期输出:

   Clust  Stat1    Stat2    Stat3    Stat4    Stat5    Stat6      TopThree
0  9      0.00     0.15     0.06     0.11     0.23     0.01   [Stat5,Stat2,Stat4]  
1  4      0.00     0.25     0.04     0.10     0.10     0.00   [Stat2,Stat4,Stat5]       
2  11     0.00     0.34     0.00     0.09     0.24     0.00   [Stat2,Stat5,Stat4]        
3  12     0.00     0.16     0.00     0.19     0.00     0.01   [Stat4,Stat2,Stat6]          
4  0      0.00     0.35     0.00     0.04     0.02     0.00   [Stat2,Stat4,Stat5]        
5  17     0.01     0.21     0.02     0.18     0.27     0.01   [Stat5,Stat2,Stat4]   

如果有人对如何做到这一点有想法,我将不胜感激。

最佳答案

使用numpy.argsort对于排序值的位置并过滤所有列而不是第一个:

a = df.iloc[:, 1:].to_numpy()
df['TopThree'] = df.columns[1:].to_numpy()[np.argsort(-a, axis=1)[:, :3]].tolist()
print (df)
   Clust  Stat1  Stat2  Stat3  Stat4  Stat5  Stat6               TopThree
0      9   0.00   0.15   0.06   0.11   0.23   0.01  [Stat5, Stat2, Stat4]
1      4   0.00   0.25   0.04   0.10   0.10   0.00  [Stat2, Stat4, Stat5]
2     11   0.00   0.34   0.00   0.09   0.24   0.00  [Stat2, Stat5, Stat4]
3     12   0.00   0.16   0.00   0.11   0.00   0.00  [Stat2, Stat4, Stat1]
4      0   0.00   0.35   0.00   0.04   0.02   0.00  [Stat2, Stat4, Stat5]
5     17   0.01   0.21   0.02   0.18   0.27   0.01  [Stat5, Stat2, Stat4]

如果性能不重要:

df['TopThree'] = df.iloc[:, 1:].apply(lambda x: x.nlargest(3).index.tolist(), axis=1)

关于python - 返回行中 3 个最高值的列名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59877664/

相关文章:

python - 使用 axis=1 聚合多个函数

python - 检查一个数据帧是否存在于另一个

python - 将数据保存在三个数组中

python - 使用 OpenCV 删除 OCR 文本框

python - dateutil 和 pytz 给出不同的结果

python - 查找 Pandas 系列中所有数据类型的最快方法?

Python:使用 pandas 数据帧中的数据更新字典

python - 如何找到数据框列内数组中的最大值?

python - 通过 Python 获取 MAPLE 的输出

python - 如何限制线程池中线程的数量以实现无限迭代?