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

