如何在groupby聚合后显示DataFrame全部列以获取各游戏获胜者?
解决方法
要获取每个游戏获胜者的完整DataFrame行,可以用以下几种简洁的实现方式:
方法1:利用idxmax()和loc索引
idxmax()会返回每个分组中Score最大值对应的行索引,再通过loc取出这些完整行:
# 获取每个GameID组内Score最高的行索引 max_indices = df.groupby('GameID')['Score'].idxmax() # 提取对应完整行 winner_df = df.loc[max_indices]
输出结果:
GameID Player Score 2 1 Bob 30 4 2 Alice 25
方法2:用transform生成组内最大值后筛选
transform('max')会将每个组的最大值广播到组内所有行,再通过布尔索引筛选出符合条件的行:
# 添加列存储每个GameID的最高得分 df['game_max_score'] = df.groupby('GameID')['Score'].transform('max') # 筛选得分等于组内最高的行,并移除临时列 winner_df = df[df['Score'] == df['game_max_score']].drop('game_max_score', axis=1)
如果同一游戏有多个并列最高分,这个方法会保留所有并列获胜者的行。
方法3:排序后取每组首行
先按GameID升序、Score降序排序,再分组取每组第一行:
winner_df = df.sort_values(by=['GameID', 'Score'], ascending=[True, False])\ .groupby('GameID')\ .head(1)
这种方法逻辑直观,默认取每组中第一个出现的最高分玩家。
内容的提问来源于stack exchange,提问作者Cirrocumulus
相关产品推荐
相关产品推荐

