You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:15:07