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

如何获取Pandas DataFrame每行最大值及其对应名称?

解决Pandas每行最大值对应名称的问题

我懂你的痛点:你的DataFrame里是成对的NameN和ScrN列,用df.idxmax(axis=1)只能拿到最大值所在的分数列(比如Scr2),没法直接关联到前面的名称列。下面给你两种靠谱的解决思路:

方法一:重塑数据结构(直观好理解)

先把原数据转成长格式,让每个名称和对应的分数一一对应,再分组提取每行的最大值:

import pandas as pd

# 模拟你的原始数据
df = pd.DataFrame({
    'Name1': ['NY', 'AZ'],
    'Scr1': [21, 31],
    'Name2': ['CA', 'BK'],
    'Scr2': [45, 46],
    'Name3': ['SF', 'AK'],
    'Scr3': [37, 23]
})

# 把每一组Name/Scr转成单独的行
melted = df.melt(
    value_vars=[('Name1','Scr1'), ('Name2','Scr2'), ('Name3','Scr3')],
    var_name=['Category', 'Row'],
    value_name='Content'
)

# 转成宽格式,让Name和Scr列对应起来
wide_form = melted.pivot(
    index=melted.groupby('Row').cumcount(),
    columns='Category',
    values='Content'
)

# 按行分组,找到分数最大的那一行
result = wide_form.loc[wide_form.groupby(level=0)['Scr'].idxmax()].reset_index(drop=True)
result.columns = ['Name', 'Hi_Scr']
print(result)

运行后输出就是你要的:

Name Hi_Scr
0   CA     45
1   BK     46

方法二:利用列名映射(高效简洁)

如果你的列名严格遵循NameN和ScrN的配对规律,这个方法更高效,不用折腾数据结构:

# 先筛选出所有分数列,拿到每行最大值所在的列名(比如Scr2)
max_score_cols = df.filter(like='Scr').idxmax(axis=1)

# 把列名里的Scr替换成Name,得到对应的名称列名(比如Name2)
name_cols = max_score_cols.str.replace('Scr', 'Name')

# 用lookup获取对应名称,同时提取最大值
result = pd.DataFrame({
    'Name': df.lookup(df.index, name_cols),
    'Hi_Scr': df.filter(like='Scr').max(axis=1)
})

print(result)

这个方法速度更快,适合处理大型数据集,结果和上面完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:10:08