首页 > 解决方案 > 返回行中 3 个最高值的列名

问题描述

我试图想出一种方法来返回下表每一行中 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]   

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

标签: pythonpandas

解决方案


用于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)

推荐阅读