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

Pandas处理Statsbomb数据:高效合并双向球员配对行(替代嵌套循环)

高效合并球员配对行的Pandas解决方案

输入数据

| Sender | recipient | n_pass |  other  |
--| ------ | --------- | ------ | ------- |
0 |  Emma  |    Lisa   |    1   | other_a |
1 |  Lisa  |    Emma   |    1   | other_b | 
2 |  Anna  |    Lisa   |    1   | other_c |
3 |  Lisa  |    Anna   |    1   | other_d |
4 |  Emma  |    Jade   |    1   | other_e |
5 |  Lisa  |    Jade   |    1   | other_f |
6 |  Jade  |    Lisa   |    1   | other_g |

需求

合并双向配对的球员行(无论谁是Sender/recipient),仅对n_pass求和,其他列保留配对中某一行的值;无对应配对的行保留原样,替换低效的嵌套循环实现。

高效解决方案代码

import pandas as pd

# 构造示例DataFrame(实际使用时替换为你的数据)
data = {
    'Sender': ['Emma', 'Lisa', 'Anna', 'Lisa', 'Emma', 'Lisa', 'Jade'],
    'recipient': ['Lisa', 'Emma', 'Lisa', 'Anna', 'Jade', 'Jade', 'Lisa'],
    'n_pass': [1, 1, 1, 1, 1, 1, 1],
    'other': ['other_a', 'other_b', 'other_c', 'other_d', 'other_e', 'other_f', 'other_g']
}
df = pd.DataFrame(data)

# 1. 标准化球员配对:将每对Sender/recipient按顺序排序,生成统一的Player_1/Player_2
df[['Player_1', 'Player_2']] = pd.DataFrame(
    df[['Sender', 'recipient']].apply(sorted, axis=1).tolist(),
    index=df.index
)

# 2. 分组聚合:按标准化配对分组,对n_pass求和,other取分组内第一个值
result = df.groupby(['Player_1', 'Player_2'], as_index=False).agg(
    n_pass=('n_pass', 'sum'),
    other=('other', 'first')
)

print(result)

输出结果

Player_1 Player_2  n_pass    other
0     Anna     Lisa       2  other_c
1     Emma     Jade       1  other_e
2     Emma     Lisa       2  other_a
3     Lisa     Jade       2  other_f

方案说明

  • 标准化配对:通过sorted将每对球员的顺序统一,让双向配对(如Emma→Lisa和Lisa→Emma)被识别为同一组,彻底避免嵌套循环逐一匹配的低效操作
  • 矢量化聚合:Pandas的groupby是原生矢量化操作,处理大规模数据时效率远高于嵌套循环
  • 灵活自定义:如果需要保留other列的其他值,可将'first'替换为'last'或自定义聚合函数;实际使用时替换球员名称为唯一数字ID即可,逻辑完全一致

内容的提问来源于stack exchange,提问作者Vitasalato

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:10:28