如何在DataFrame中按行提取多列值最大和第二大的列名
实现DataFrame每行最大、第二大值对应的列名
方法1:用apply结合nlargest(直观易懂)
直接对每行提取前两大值的列名,快速生成目标列:
import pandas as pd # 构造示例DataFrame data = { 'index 1': [0.0585, 0.0585, 0.0590, 0.0599, 0.0803, 0.0613], 'index 2': [0.0775, 0.0750, 0.0729, 0.0711, 0.0689, 0.0677], 'index 3': [-0.0289, -0.0300, -0.0311, -0.0309, -0.0309, 0.0989], 'index 4': [0.0069, 0.0065, 0.0065, 0.0067, 0.0071, 0.0083] } df = pd.DataFrame(data, index=pd.date_range('2023-07-14', periods=6, freq='B')) # 生成前两大值的列名并赋值给新列 top2_cols = df.apply(lambda row: row.nlargest(2).index.tolist(), axis=1, result_type='expand') df[['Rank 1', 'rank 2']] = top2_cols
执行后就能得到你想要的结果。
方法2:用argsort处理(大数据量更高效)
如果你的DataFrame行数很多,用argsort性能更优:
# 获取每行值从小到大排序后的列索引 sorted_idx = df.values.argsort(axis=1) # 取最后两个索引(对应最大和第二大值),反转顺序得到第一、第二的位置 top2_idx = sorted_idx[:, -2:][:, ::-1] # 映射为列名并赋值 df[['Rank 1', 'rank 2']] = df.columns[top2_idx]
关于df.rank的补充
你提到的df.rank其实支持按行操作,只需设置axis=1,但它返回的是排名数值而非列名,示例如下:
# 按行降序排名(值越大排名越靠前) rank_values = df.rank(axis=1, ascending=False)
内容的提问来源于stack exchange,提问作者manwong0606
相关产品推荐
相关产品推荐

