python - 返回行中 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]
如果有人对如何做到这一点有想法,我将不胜感激。
解决方案
用于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 - 将消息从 RabbitMQ 队列发送到 Websocket 连接,反之亦然
- node.js - 从自定义 lambda 自定义中间件返回错误
- themes - CKeditor 5 背景颜色变化
- reactjs - React Native Web/Expo:如何在 Pressable 上模拟焦点可见?
- php - Laravel/codeception 测试:如何存根 time()
- aws-lambda - 将 dynamodb 流事件源触发器配置为具有可配置的重试延迟
- spring-boot - Spring JPA 存储库方法来获取排序的不同和非空值
- r - 从不等向量长度的列表中创建 data.table
- php - WooCommerce 如何检查产品是否有货
- maven - 使用版本范围时,maven 无法解决依赖关系