You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas如何按行获取Top3值对应列ID并存入新列

每行取Top3值对应列ID的实现方法

你之前用的idxmax(axis=1)仅能返回单行最大值对应的列名,要获取排名前3的列ID,可直接使用以下两种方案:

方案1:pandas原生写法(可读性高)

不需要额外引入依赖,逻辑和你原来的idxmax思路最贴近,逐行取前N大值的索引即可:

# 定义参与排名的列集合
rank_cols = ['VolumeKBE', 'VolumeKRE', 'VolumeIYR', 'VolumeITB', 'VolumeSMH']

# 逐行计算前3大值对应的列名,展开为独立列
df[['Top1', 'Top2', 'Top3']] = df[rank_cols].apply(
    lambda row: row.nlargest(3).index.tolist(),
    axis=1,
    result_type='expand'
)

方案2:numpy向量化写法(性能更高)

数据量较大时优先用这个方案,运行速度比apply写法快数倍:

import numpy as np

rank_cols = ['VolumeKBE', 'VolumeKRE', 'VolumeIYR', 'VolumeITB', 'VolumeSMH']
# 对行内值做降序排序,取前3个位置的索引映射回列名
top3_indices = np.argsort(-df[rank_cols].values, axis=1)[:, :3]
df[['Top1', 'Top2', 'Top3']] = np.array(rank_cols)[top3_indices]

结果说明

以你给出的示例数据第0行为例:行内值分别为2722.0、51852.0、10873.0、28562.0、84673.0,计算后得到的三列值依次为VolumeSMH、VolumeKRE、VolumeITB,和数值从高到低的排序完全对应。

若行内存在相等值,两种方案都会默认优先选取列顺序更靠前的字段进入Top3。

内容的提问来源于stack exchange,提问作者pythonheadache

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 00:03:19