如何在Python DataFrame中提取每行含最大值的多列列名?
提取每行中含最大值的所有列名
你可以通过以下两种方法实现需求:
方法一:逐行筛选(简洁直观)
直接对数值列使用apply,结合布尔索引提取所有等于该行最大值的列名:
import pandas as pd data = [['rama', 10, 20, 20,12], ['radha', 15, 18, 12, 18], ['sai', 14, 12, 10, 11]] ex_df = pd.DataFrame(data, columns=['name','sub1','sub2','sub3','sub4']) # 定义数值列范围(排除name列) numeric_cols = ex_df.columns[1:] # 生成每行最大值对应的列名列表 ex_df['max_columns'] = ex_df[numeric_cols].apply( lambda row: row[row == row.max()].index.tolist(), axis=1 ) # 查看结果 print(ex_df[['name', 'max_columns']])
输出结果:
name max_columns 0 rama [sub2, sub3] 1 radha [sub2, sub4] 2 sai [sub1]
方法二:矢量化处理(高效适用于大数据集)
先计算每行最大值,再生成布尔掩码筛选列名,避免逐行循环的性能损耗:
import pandas as pd data = [['rama', 10, 20, 20,12], ['radha', 15, 18, 12, 18], ['sai', 14, 12, 10, 11]] ex_df = pd.DataFrame(data, columns=['name','sub1','sub2','sub3','sub4']) numeric_cols = ex_df.columns[1:] # 计算每行的最大值 row_max_values = ex_df[numeric_cols].max(axis=1) # 生成布尔矩阵:标记每个元素是否等于对应行的最大值 max_mask = ex_df[numeric_cols].eq(row_max_values, axis=0) # 提取每行中标记为True的列名,转为列表 ex_df['max_columns'] = max_mask.apply(lambda x: x[x].index.tolist(), axis=1) print(ex_df['max_columns'])
核心逻辑说明
两种方法的核心都是:
- 定位数值列,排除非数值列(比如你的
name列) - 找到每行的最大值
- 筛选出该行中值等于最大值的所有列,提取它们的列名并转为列表
内容的提问来源于stack exchange,提问作者Aparna Bhat
相关产品推荐
相关产品推荐

