Pandas DataFrame使用groupby按条件筛选行:获取各联合会最高奖牌对应项目
实现方案
方案1:只取每个分组首个最大值对应的行
如果不需要处理并列最大值的情况,用idxmax()获取每个分组最大值对应的行索引后直接筛选即可:
# 按Federation分组,取Medal_each_game最大值对应的行,重置索引 res = df.loc[df.groupby('Federation')['Medal_each_game'].idxmax()].reset_index(drop=True)
逻辑说明:groupby('Federation')['Medal_each_game'].idxmax()会返回每个联合会最高奖牌数对应的行原始索引,用loc定位这些行后重置索引,就能得到目标结果。
方案2:保留所有并列最大值的行
如果同一个联合会存在多个项目奖牌数同为最高的场景,用transform做布尔筛选更合适:
# 筛选每个分组内等于最大值的所有行,重置索引 res = df[df['Medal_each_game'] == df.groupby('Federation')['Medal_each_game'].transform('max')].reset_index(drop=True)
逻辑说明:transform('max')会将每个分组的最大值填充到分组内的所有行,通过等值判断可以过滤出所有符合最高奖牌数条件的行。
完整可运行测试代码
import pandas as pd # 构造示例DataFrame data = { 'Federation': ['AFG', 'AFG', 'AFG', 'AFG', 'AFG', 'AFG', 'AHO', 'AHO', 'AHO', 'AHO'], 'Game': ['Athletics', 'Boxing', 'Football', 'Hockey', 'Taekwondo', 'Wrestling', 'Athletics', 'Boxing', 'Fencing', 'Football'], 'Medal_each_game': [1.0, 0.0, 1.0, 0.0, 2.0, 0.0, 0.0, 3.0, 2.0, 0.0] } df = pd.DataFrame(data) # 执行方案1代码 res = df.loc[df.groupby('Federation')['Medal_each_game'].idxmax()].reset_index(drop=True) print(res)
运行输出和示例完全一致:
Federation Game Medal_each_game 0 AFG Taekwondo 2.0 1 AHO Boxing 3.0
内容的提问来源于stack exchange,提问作者Karthik Deepan
相关产品推荐
相关产品推荐

