Pandas合并重复行:累加足球运动员赛季转会后的积分
搞定Pandas合并转会球员重复行并累加数据的问题
嘿,我来帮你解决这个转会球员重复行合并的问题!首先得明确:咱们判断是不是同一个球员,得靠full_name这个唯一标识——毕竟像示例里的两个Bruno,名字缩写一样但全名不同,肯定是俩不同的球员对吧?所以核心思路就是按球员的全名分组,把他们在不同俱乐部(或者同一俱乐部不同阶段)的积分、首发/替补次数这些数据累加起来,其他信息按需整理。
先理清楚你的数据情况
先把你给的示例数据整理得清楚点:
| name | full_name | club | Points | Start | Sub | |
|---|---|---|---|---|---|---|
| 84 | S. Mustafi | Shkodran Mustafi | Arsenal | 76 | 26 | 1 |
| 85 | S. Mustafi | Shkodran Mustafi | Arsenal | -2 | 0 | 1 |
| 89 | Bruno | Bruno Soriano Llido | Villarreal CF | 43 | 15 | 16 |
| 90 | Bruno | Bruno Gonzalez Cabrera | Getafe CF | 43 | 15 | 16 |
你看,S. Mustafi是同一球员的两行记录(可能是赛季不同阶段的数据),而两个Bruno是完全不同的球员,所以分组的时候必须用full_name才不会出错。
直接上代码解决方案
方法1:灵活自定义聚合规则(推荐)
这种方法可以针对每一列设置不同的处理逻辑,比如把球员效力过的俱乐部都列出来,数值列直接累加:
import pandas as pd # 假设你的DataFrame叫df # 定义每一列的聚合规则 agg_rules = { 'name': 'first', # 取第一个出现的名字缩写就行,毕竟和full_name一一对应 'club': lambda x: ', '.join(x.unique()), # 把所有效力过的俱乐部用逗号拼起来 'Points': 'sum', # 核心需求:累加积分 'Start': 'sum', # 首发次数也一起累加吧 'Sub': 'sum' # 替补次数同理 } # 按full_name分组,应用规则,as_index=False让分组列不变成索引 merged_df = df.groupby('full_name', as_index=False).agg(agg_rules)
方法2:简化版(如果name和full_name完全对应)
要是你确定name和full_name是一一对应的,也可以把这俩一起作为分组键,代码更简洁:
merged_df = df.groupby(['full_name', 'name'], as_index=False).agg({ 'club': lambda x: ', '.join(x.unique()), 'Points': 'sum', 'Start': 'sum', 'Sub': 'sum' })
看看处理后的效果
比如S. Mustafi的记录会合并成一行:
| full_name | name | club | Points | Start | Sub |
|---|---|---|---|---|---|
| Shkodran Mustafi | S. Mustafi | Arsenal | 74 | 26 | 2 |
而两个Bruno会各自保留独立的行,因为他们的全名不一样,不会被错误合并。
额外小技巧
- 要是你只想保留球员最后效力的俱乐部,把
club的聚合规则改成'club': 'last'就行; - 要是还有其他列需要处理,直接在聚合规则里加对应的逻辑就好,比如日期列取最早/最晚,都很灵活。
内容的提问来源于stack exchange,提问作者pandasman
相关产品推荐
相关产品推荐

