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
相关产品推荐
相关产品推荐

