Pandas合并DataFrame后TEU列求和结果与合并前不符问题
问题原因与解决方案
核心原因
执行外连接时,如果subset_df1中的某一行在subset_df2中匹配到多个条目,Pandas会将这一行复制多份对应每个匹配项,最终导致过滤right_only后的TEU总和超出原df1的总和。你遇到的差值3,正好对应某一行TEU值为3的条目被多复制了1次。
排查步骤
- 确认连接键:默认
merge会用所有同名列作为连接键,检查是否符合你的预期匹配逻辑,避免因多列意外匹配导致重复。 - 定位重复行:执行以下代码找出原df1中被重复复制的行:
# 按原df1的所有列分组,统计merge后both类别的行计数 duplicate_check = subset_merge[subset_merge._merge == 'both']\ .groupby(subset_df1.columns.tolist())['TEU']\ .count() # 输出计数大于1的行,这些就是被重复的条目 print(duplicate_check[duplicate_check > 1])
修复方案
根据业务需求选择以下一种:
- 指定正确连接键:明确设置
on参数,确保只有预期列参与匹配,避免无意义重复:# 替换为你实际需要的连接键列名,比如['order_id'] subset_merge = subset_df1.merge(subset_df2, how='outer', on=['order_id'], indicator=True) sum_TEU_df1_after_merge = subset_merge['TEU'][subset_merge._merge != 'right_only'].sum() print(sum_TEU_df1_after_merge) - 去重后求和:若无法修改连接键,可基于原df1的唯一标识列去重后再求和:
# 按原df1的列去重,保留唯一行后求和 sum_TEU_corrected = subset_merge[subset_merge._merge != 'right_only']\ .drop_duplicates(subset_df1.columns.tolist())['TEU']\ .sum() print(sum_TEU_corrected) - 提前校验匹配关系:使用
validate参数限制匹配类型,比如validate='1:1'确保一对一匹配,若存在一对多则直接报错:subset_merge = subset_df1.merge(subset_df2, how='outer', indicator=True, validate='1:1')
内容的提问来源于stack exchange,提问作者vasanth kumar
相关产品推荐
相关产品推荐

