Pandas左连接合并DataFrame后行数增加问题排查
左连接后DataFrame行数增加的原因及解决办法
核心原因
左连接后行数从570变为681,本质是DF2中存在重复的['em casa', 'visitante', 'temporada']键组合。
当DF1的某一行在DF2中匹配到多个相同的键组合时,pandas会为每个匹配生成一行新数据,导致总行数膨胀。比如DF1中1行对应DF2中2行匹配,就会被拆分为2行,累计后总行数自然增加。
验证方法
先确认DF2的键组合是否存在重复:
# 检查是否存在重复的键组合 print(DF2.duplicated(subset=['em casa', 'visitante', 'temporada']).any()) # 查看重复次数最多的键组合详情 duplicate_counts = DF2.groupby(['em casa', 'visitante', 'temporada']).size().sort_values(ascending=False) print(duplicate_counts.head(10))
如果输出True,说明重复的键组合确实是行数增加的直接原因。
解决办法
根据重复的具体原因,对应处理:
1. DF2存在冗余重复数据
如果DF2中的重复行是爬取错误导致的冗余数据,先对DF2去重后再合并:
# 保留每个键组合的第一行,删除其他重复行 DF2_clean = DF2.drop_duplicates(subset=['em casa', 'visitante', 'temporada'], keep='first') # 执行左连接 DF1_merged = DF1.merge(DF2_clean, on=['em casa', 'visitante', 'temporada'], how='left')
2. 键组合不足以唯一标识单场比赛
同一个赛季中,两队可能会踢2场(主客场各一场),仅用主队、客队、赛季无法区分两场比赛,导致DF2中同一键组合对应两场不同比赛的数据,合并时产生错误匹配。
这种情况需要补充唯一标识单场比赛的列作为合并键,比如比赛日期(data)或轮次(sem):
# 加入data作为额外合并键,确保匹配同一场比赛 DF1_merged = DF1.merge(DF2, on=['em casa', 'visitante', 'temporada', 'data'], how='left')
后续处理:填充缺失值
合并后会出现类似home_cruzamentos_x(原DF1列)和home_cruzamentos_y(DF2列)的重复列,需要用DF2的数据填充DF1的NaN,然后清理冗余列:
# 列出所有需要填充的列名 cols_to_fill = ['home_cruzamentos', 'away_cruzamentos', 'home_bote defensivo', 'away_bote defensivo', 'home_cortes', 'away_cortes', 'home_jogadas aéreas', 'away_jogadas aéreas', 'home_defesas', 'away_defesas', 'home_bolas longas', 'away_bolas longas', 'home_acerto_de_passes', 'away_acerto_de_passes'] for col in cols_to_fill: DF1_merged[col] = DF1_merged[f'{col}_x'].fillna(DF1_merged[f'{col}_y']) # 删除冗余的_x和_y列 DF1_merged.drop([f'{col}_x', f'{col}_y'], axis=1, inplace=True)
或者用更简洁的combine_first方法:
# 对齐索引后直接合并填充 DF1_filled = DF1.set_index(['em casa', 'visitante', 'temporada']).combine_first(DF2.set_index(['em casa', 'visitante', 'temporada'])).reset_index()
内容的提问来源于stack exchange,提问作者Allan Campos
相关产品推荐
相关产品推荐

