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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:57:13