Python如何按国家分组筛选出各国运动员人数最多的运动项目
解决方案
首先纠正现有代码的写法问题:df.groupby('country', 'sport')是错误写法,多个分组键需要放在列表中传入,否则第二个参数会被识别为axis参数,无法得到预期的各国各项目运动员人数统计结果。
以下是两种常用的实现思路,可按需选择:
- 方案1:排序后去重(逻辑简单易读,适合中小数据量)
# 1. 统计每个国家每个运动项目的运动员人数 country_sport_cnt = df.groupby(['country', 'sport'], as_index=False)['name'].count().rename(columns={'name': 'athlete_cnt'}) # 2. 按国家升序、运动员人数降序排序,每个国家只保留第一条记录(即人数最多的项目) result = country_sport_cnt.sort_values(['country', 'athlete_cnt'], ascending=[True, False]).drop_duplicates(subset='country', keep='first')
- 方案2:按国家取最大值索引(运行效率更高,适合大数据量)
# 1. 统计每个国家每个运动项目的运动员人数 country_sport_cnt = df.groupby(['country', 'sport'], as_index=False)['name'].count().rename(columns={'name': 'athlete_cnt'}) # 2. 取每个国家人数最大值对应的行索引,筛选出目标行 max_idx = country_sport_cnt.groupby('country')['athlete_cnt'].idxmax() result = country_sport_cnt.loc[max_idx]
- 特殊场景处理:如果需要保留某个国家多个并列人数最高的项目,使用如下写法:
country_sport_cnt = df.groupby(['country', 'sport'], as_index=False)['name'].count().rename(columns={'name': 'athlete_cnt'}) # 生成每个国家的最高运动员人数字段,筛选匹配行 country_sport_cnt['max_athlete_cnt'] = country_sport_cnt.groupby('country')['athlete_cnt'].transform('max') result = country_sport_cnt[country_sport_cnt['athlete_cnt'] == country_sport_cnt['max_athlete_cnt']].drop(columns='max_athlete_cnt')
内容的提问来源于stack exchange,提问作者JDAR
相关产品推荐
相关产品推荐

