Pandas查找DataFrame每行最大值对应的行名、列名及取值实现方案
问题解决方法
报错原因
你遇到的AttributeError: 'DataFrame' object has no attribute 'idmax'报错是拼写错误导致的:pandas 1.0及以上版本已经废弃了idmax方法,正确的获取最大值对应索引/列名的方法是idxmax(多了一个字母x)。
完整实现步骤
我们可以拆分实现「匹配学生姓名、最高分科目、分数」的需求,假设你的df_merged第一列为学生姓名列(列名为name),其余列均为科目分数字段,操作如下:
- 首先筛选出所有科目的列名,排除姓名列
- 调用
idxmax(axis=1)获取每行最高分对应的科目名称 - 调用
max(axis=1)获取每行最高分数值 - 合并字段输出符合要求的结果
示例代码
import pandas as pd # 可跳过该步骤:模拟你的数据集结构,你可以直接用自己的df_merged data = { 'name': ['A', 'B', 'C', 'D', 'E'], 'Math': [96, 85, 88, 76, 82], 'Physics': [92, 89, 78, 81, 85], 'English': [89, 79, 86, 79, 87] } df_merged = pd.DataFrame(data) # 核心处理逻辑 subject_cols = df_merged.columns.drop('name') df_merged['max_subject'] = df_merged[subject_cols].idxmax(axis=1) df_merged['max_score'] = df_merged[subject_cols].max(axis=1) # 输出符合你要求的格式 result = df_merged[['name', 'max_subject', 'max_score']].reset_index(drop=True) result.index += 1 # 生成序号列 print(result.to_csv(sep=' ', header=False))
输出效果
运行上述代码后输出结果和你给出的预期样例完全一致:
1 A Math 96 2 B Physics 89 3 C Math 88 4 D Physics 81 5 E English 87
注意事项
- 如果你的姓名列实际名称不是
name,替换成你自己的字段名即可 - 存在多个科目同分都是最高分的情况时,
idxmax默认返回第一个出现的科目,需要保留所有最高分科目可额外增加去重、筛选逻辑 - 若你的数据集第一列是索引而不是普通列,可先通过
df_merged = df_merged.reset_index()将索引转为普通的姓名列再处理
内容的提问来源于stack exchange,提问作者MAL
相关产品推荐
相关产品推荐

