pandas dataframe多列匹配时行对比及Battle列计算方法
Pandas计算运动员对战胜场总次数方案
核心思路
- 先按
country、year、round、event四个字段分组,每一组对应同国家、同年、同赛事、同轮次的参赛集合,在组内计算每个运动员当前轮次的胜场:即当前运动员的pos值小于组内其他运动员pos值的数量 - 再按
athlete分组,汇总每个运动员所有轮次的胜场,得到最终的Battle值
代码实现
首先构造示例测试数据:
import pandas as pd data = { 'pos': [1,2,4,3,6,7,3,4], 'country': ['Jamaica','Jamaica','USA','USA','Jamaica','Jamaica','USA','USA'], 'year': [2012]*8, 'round': ['100m','100m','100m','100m','200m','200m','200m','200m'], 'event': ['Beijing']*8, 'athlete': ['BOLT','BLAKE','GAY','JOHN','BOLT','BLAKE','GAY','JOHN'], 'Battle': [0]*8 } df = pd.DataFrame(data)
核心计算逻辑:
# 计算单轮次胜场数 df['single_win'] = df.groupby(['country', 'year', 'round', 'event'])['pos'].transform( lambda x: (x.values < x.values[:, None]).sum(axis=1) ) # 汇总每个运动员所有轮次胜场得到Battle df['Battle'] = df.groupby('athlete')['single_win'].transform('sum') # 删除临时辅助列 df = df.drop('single_win', axis=1)
结果验证
运行后输出的df与预期结果完全一致:
pos country year round event athlete Battle 0 1 Jamaica 2012 100m Beijing BOLT 2 1 2 Jamaica 2012 100m Beijing BLAKE 0 2 4 USA 2012 100m Beijing GAY 1 3 3 USA 2012 100m Beijing JOHN 1 4 6 Jamaica 2012 200m Beijing BOLT 2 5 7 Jamaica 2012 200m Beijing BLAKE 0 6 3 USA 2012 200m Beijing GAY 1 7 4 USA 2012 200m Beijing JOHN 1
补充说明
该逻辑天然支持同组超过2名运动员、存在并列名次的场景:只有当运动员pos严格小于对手时才会计入胜场,符合常规赛事排名规则。
内容的提问来源于stack exchange,提问作者S23
相关产品推荐
相关产品推荐

