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

如何在Pandas DataFrame中提取每行前3大值及对应列名(按列索引优先)

需求描述

给定列名从x_1到x_10的DataFrame(列顺序至关重要),需要为每行新增6列:Max1、ValMax1、Max2、ValMax2、Max3、ValMax3,分别存储每行前3大值对应的列名和数值。

规则说明:

  • 若某行存在多个相同的最大值,Max1保留列索引最小的列名;
  • 若该行有超过3个高值(数值并列前3),仅保留前3个列索引最小的列名。

输入DataFrame

x_1 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10
  0   0   1   2   2   0   0   0   0    0
  4   4   0   4   4   1   0   0   0    0
  0   0   1   2   3   0   0   0   0    0

期望输出DataFrame

x_1 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10 Max1 ValMax1 Max2 ValMax2 Max3 ValMax3
  0   0   1   2   2   0   0   0   0    0  x_4       2  x_5       2  x_3       1
  4   4   0   4   4   1   0   0   0    0  x_1       4  x_2       4  x_4       4
  0   0   1   2   3   0   0   0   0    0  x_5       3  x_4       2  x_3       1
解决方案

通过Pandas的稳定排序+提取操作实现,核心逻辑是先按数值降序排序,值相同时保留原列索引靠前的列:

import pandas as pd

# 构造输入DataFrame
df = pd.DataFrame({
    'x_1': [0,4,0],
    'x_2': [0,4,0],
    'x_3': [1,0,1],
    'x_4': [2,4,2],
    'x_5': [2,4,3],
    'x_6': [0,1,0],
    'x_7': [0,0,0],
    'x_8': [0,0,0],
    'x_9': [0,0,0],
    'x_10': [0,0,0]
})

# 对每行做稳定排序:值降序,值相同则按原列顺序(索引升序)排列
sorted_rows = df.apply(lambda row: row.sort_values(ascending=False, kind='mergesort'), axis=1)

# 提取前3个的列名和数值
top3_names = sorted_rows.columns[:3]
top3_values = sorted_rows.iloc[:, :3]

# 赋值到新增列
df['Max1'] = top3_names[0]
df['ValMax1'] = top3_values.iloc[:, 0]
df['Max2'] = top3_names[1]
df['ValMax2'] = top3_values.iloc[:, 1]
df['Max3'] = top3_names[2]
df['ValMax3'] = top3_values.iloc[:, 2]

print(df)

关键说明

  • 使用mergesort稳定排序,确保值相同时原列索引小的列优先排在前面,完全匹配规则要求;
  • 排序后直接截取前3列的列名和数值,快速生成目标新增列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:47:33