如何在Pandas中基于同日期对手与球队匹配条件合并行?
合并同日期下互为对手的比赛记录
实现思路
核心是通过配对标识快速定位同日期内互为对手的比赛行,再分组合并数据:
- 为每条记录生成唯一配对键:将
date、排序后的team和opponent拼接,确保互为对手的两行键值一致 - 按配对键分组,对每组内的记录进行合并:提取对手的进球数(
gf)和失球数(ga)作为新字段 - 过滤重复行,保留目标记录(优先保留主场行)
代码实现
import pandas as pd # 替换为你的大型DataFrame data = { 'date': ['2017-08-11', '2017-08-11', '2017-08-11', '2019-08-11'], 'venue': ['Home', 'Away', 'Home', 'Home'], 'result': ['W', 'L', 'D', 'D'], 'gf': [4, 1, 2, 1], 'ga': [1, 4, 0, 0], 'team': ['Arsenal', 'Burnley', 'Fulham', 'Arsenal'], 'opponent': ['Burnley', 'Arsenal', 'Leeds', 'Burnley'] } df = pd.DataFrame(data) # 生成配对键:同日期下,互为对手的记录会有相同的键 df['pair_key'] = df.apply( lambda row: '_'.join([row['date']] + sorted([row['team'], row['opponent']])), axis=1 ) # 分组处理配对记录 def process_pair_group(group): if len(group) == 2: # 优先保留主场记录,若没有则取第一行 main_record = group[group['venue'] == 'Home'] if main_record.empty: main_record = group.iloc[[0]] # 获取对手的记录 opp_record = group[group.index != main_record.index[0]] # 添加对手的进球/失球字段 main_record['gf_opponent'] = opp_record['gf'].values[0] main_record['ga_opponent'] = opp_record['ga'].values[0] return main_record # 无配对的记录直接返回 else: return group # 应用分组逻辑并清理临时字段 merged_df = df.groupby('pair_key', group_keys=False).apply(process_pair_group).reset_index(drop=True) merged_df = merged_df.drop(columns=['pair_key']) # 输出结果 print(merged_df)
运行结果
date venue result gf ga team opponent gf_opponent ga_opponent 0 2017-08-11 Home W 4 1 Arsenal Burnley 1.0 4.0 1 2017-08-11 Home D 2 0 Fulham Leeds NaN NaN 2 2019-08-11 Home D 1 0 Arsenal Burnley NaN NaN
补充说明
- 无配对记录的空值可通过
merged_df.fillna('')替换为空字符串 - 若需调整保留记录的规则(比如优先特定球队),修改
process_pair_group内的筛选逻辑即可 - 分组操作效率较高,适配大型DataFrame处理
内容的提问来源于stack exchange,提问作者Miserry
相关产品推荐
相关产品推荐

