Python实现DataFrame新增列展示篮球比赛对应球队的对手名称
Pandas实现按比赛场次匹配对手列的方案
核心前提:每场GameID对应的赛事固定有且仅有2支参赛球队,符合篮球比赛的业务场景。
方案1:简洁写法(适合中小数据集)
通过groupby+transform直接按场次分组计算对手,代码如下:
import pandas as pd # 核心逻辑:按GameID分组后对每行TeamID匹配同场另一支球队 games['Opponents'] = games.groupby('GameID')['TeamID'].transform( lambda group: group.map(lambda team: [t for t in group.unique() if t != team][0]) )
逻辑说明:
- 按
GameID拆分每场比赛的所有行 - 对每场比赛先提取参赛的2支球队唯一值
- 逐行匹配:过滤掉当前行的球队,剩下的唯一值就是对手
方案2:高性能写法(适合百万级以上大数据集)
提前构造对阵映射字典,避免分组内重复计算,性能提升明显:
# 1. 预构造每场的(赛事ID, 球队)到对手的映射关系 opponent_mapping = {} for game_id, game_df in games.groupby('GameID'): two_teams = game_df['TeamID'].unique() opponent_mapping[(game_id, two_teams[0])] = two_teams[1] opponent_mapping[(game_id, two_teams[1])] = two_teams[0] # 2. 批量映射得到对手列 games['Opponents'] = games.apply(lambda x: opponent_mapping[(x['GameID'], x['TeamID'])], axis=1)
运行以上任意一种方案,都能得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者Barrizzle
相关产品推荐
相关产品推荐

