Python Pandas合并DataFrame后行数多于原数据,求问题原因
合并DataFrame行数异常的原因与排查方案
核心原因:"Filename"列存在重复值
你遇到的行数膨胀,以及各种连接方式(left/inner/outer/right)结果行数一致的情况,本质是两个DataFrame的"Filename"列存在重复条目,导致合并时产生笛卡尔积:
- 如果A中某个
Filename出现N次,B中同一个Filename出现M次,合并后该Filename对应的行数会变成N×M,而非原有的N行。 - 所有连接方式行数一致,说明A中所有
Filename在B中都有匹配项,且重复匹配的情况覆盖了整个数据集。
验证步骤
1. 检查A中"Filename"的重复情况
# 统计A中重复出现的Filename及其次数 a_dup_counts = A['Filename'].value_counts() a_duplicates = a_dup_counts[a_dup_counts > 1] print("A中重复的Filename数量:", len(a_duplicates)) print("A中重复Filename的出现次数:\n", a_duplicates)
2. 检查B中对应A的Filename的重复情况
# 筛选出B中与A重叠的Filename,再统计重复 b_matched = B[B['Filename'].isin(A['Filename'])] b_dup_counts = b_matched['Filename'].value_counts() b_duplicates = b_dup_counts[b_dup_counts > 1] print("B中与A重叠的重复Filename数量:", len(b_duplicates)) print("B中重复Filename的出现次数:\n", b_duplicates)
3. 定位具体导致行数增加的记录
# 给A添加临时行号,合并后按行号分组统计行数 A['temp_row_id'] = range(len(A)) merged_with_id = A.merge(B, on='Filename', how='left') row_expand_counts = merged_with_id.groupby('temp_row_id').size() # 找出合并后行数翻倍的原A行,对应的Filename就是问题来源 problematic_rows = row_expand_counts[row_expand_counts > 1].index problematic_filenames = A.loc[problematic_rows, 'Filename'].unique() print("导致行数增加的Filename:\n", problematic_filenames)
解决办法
根据业务需求选择对应方案:
- 如果B中同一Filename的多条记录是重复垃圾数据:先对B去重再合并
# keep='first'保留第一条,'last'保留最后一条 B_dedup = B.drop_duplicates(subset='Filename', keep='first') merged = A.merge(B_dedup, on='Filename', how='left') - 如果B中同一Filename的多条记录是细分有效数据:先聚合再合并
# 示例:数值列取均值,字符串列取第一条,可根据业务调整聚合逻辑 B_agg = B.groupby('Filename').agg({ '数值列1': 'mean', '数值列2': 'sum', '分类列': 'first' }).reset_index() merged = A.merge(B_agg, on='Filename', how='left') - 如果A中重复的Filename是业务错误:先清理A的重复数据
A_dedup = A.drop_duplicates(subset='Filename', keep='first') merged = A_dedup.merge(B, on='Filename', how='left')
内容的提问来源于stack exchange,提问作者Kyle_Stockton
相关产品推荐
相关产品推荐

