使用Pandas groupby统计各州大选获胜者时如何保留候选人列
解决方案
你可以通过以下两种简洁的方法实现需求,直接定位每个州得票最高的完整行,自然保留候选人列信息:
方法1:排序后按州去重(逻辑最直观)
先按州分组、组内按总票数降序排序,再按州去重保留第一条即可:
# 按州升序、总票数降序排序 group_sorted = group.sort_values(['state', 'totalVoteSum'], ascending=[True, False]) # 按州去重,保留每个州第一条(得票最高)的记录 state_winner = group_sorted.drop_duplicates('state', keep='first') # 调整列名和顺序匹配你需要的输出格式 state_winner = state_winner.rename(columns={ 'state': 'State', 'candidate': 'Candidate', 'totalVoteSum': 'Votes' })[['State', 'Candidate', 'Votes']].reset_index(drop=True)
方法2:用idxmax定位最高得票行索引
直接通过分组取最高得票对应的行索引,提取对应行即可:
# 获取每个州总票数最高的记录的行索引 max_vote_idx = group.groupby('state')['totalVoteSum'].idxmax() # 提取对应行并调整输出格式 state_winner = group.loc[max_vote_idx].rename(columns={ 'state': 'State', 'candidate': 'Candidate', 'totalVoteSum': 'Votes' })[['State', 'Candidate', 'Votes']].reset_index(drop=True)
原代码问题说明
你之前的写法只对totalVoteSum列做了max聚合计算,pandas默认不会自动关联该最大值对应的candidate字段,所以会丢失该列。上面两种方法都是直接定位到最高得票对应的完整行,因此可以保留所有需要的字段。
内容的提问来源于stack exchange,提问作者sarcasm
相关产品推荐
相关产品推荐

