求助:获取各年龄段薪资最高的NBA球员数据(代码异常)
解决NBA球员年龄段薪资最高记录提取问题
问题根源
你将Player设为DataFrame的索引后,groupby(['Age']).idxmax()返回的是每个年龄组中薪资最高的行的索引值(即球员姓名)。而你只选取了Age和salary两列进行操作,导致结果里的salary列显示的是索引(球员名),而非实际薪资。同时因为Player是索引而非普通列,直接调用会触发“列不明确”的错误。
解决方案
以下是三种实用的解决方法:
方法一:重置索引后提取目标行
先把Player从索引恢复为普通列,再通过idxmax定位每组薪资最高的行:
# 将Player索引转为普通列 sa.df = sa.df.reset_index() # 定位每个Age组薪资最高的行,提取所需列 result = sa.df.loc[sa.df.groupby('Age')['salary'].idxmax(), ['Age', 'Player', 'salary']]
方法二:直接利用索引匹配(不改动原索引)
如果不想调整原DataFrame的索引结构,可以先获取目标行的索引,再提取对应数据并转换索引为列:
# 获取每个Age组薪资最高的球员索引 top_player_indices = sa.df.groupby('Age')['salary'].idxmax() # 提取目标行,将索引(Player)转为列 result = sa.df.loc[top_player_indices, ['Age', 'salary']].reset_index()
方法三:用nlargest直观提取
通过分组后调用nlargest直接取每组薪资最高的1行:
# 重置索引后分组取顶薪记录,清理层级索引 result = sa.df.reset_index().groupby('Age').apply(lambda x: x.nlargest(1, 'salary')).reset_index(drop=True) # 筛选所需列 result = result[['Age', 'Player', 'salary']]
结果说明
以上方法都会返回一个DataFrame,每个年龄段仅保留一行数据,包含Age、Player和对应最高salary。
内容的提问来源于stack exchange,提问作者R.Harg
相关产品推荐
相关产品推荐

