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
相关产品推荐
相关产品推荐

