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

Pandas查找DataFrame每行最大值对应的行名、列名及取值实现方案

问题解决方法

报错原因

你遇到的AttributeError: 'DataFrame' object has no attribute 'idmax'报错是拼写错误导致的:pandas 1.0及以上版本已经废弃了idmax方法,正确的获取最大值对应索引/列名的方法是idxmax(多了一个字母x)。

完整实现步骤

我们可以拆分实现「匹配学生姓名、最高分科目、分数」的需求,假设你的df_merged第一列为学生姓名列(列名为name),其余列均为科目分数字段,操作如下:

  1. 首先筛选出所有科目的列名,排除姓名列
  2. 调用idxmax(axis=1)获取每行最高分对应的科目名称
  3. 调用max(axis=1)获取每行最高分数值
  4. 合并字段输出符合要求的结果

示例代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:27:03