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

