You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas合并DataFrame后TEU列求和结果与合并前不符问题

问题原因与解决方案

核心原因

执行外连接时,如果subset_df1中的某一行在subset_df2中匹配到多个条目,Pandas会将这一行复制多份对应每个匹配项,最终导致过滤right_only后的TEU总和超出原df1的总和。你遇到的差值3,正好对应某一行TEU值为3的条目被多复制了1次。

排查步骤

  1. 确认连接键:默认merge会用所有同名列作为连接键,检查是否符合你的预期匹配逻辑,避免因多列意外匹配导致重复。
  2. 定位重复行:执行以下代码找出原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])
    

修复方案

根据业务需求选择以下一种:

  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)
    
  2. 去重后求和:若无法修改连接键,可基于原df1的唯一标识列去重后再求和:
    # 按原df1的列去重,保留唯一行后求和
    sum_TEU_corrected = subset_merge[subset_merge._merge != 'right_only']\
        .drop_duplicates(subset_df1.columns.tolist())['TEU']\
        .sum()
    print(sum_TEU_corrected)
    
  3. 提前校验匹配关系:使用validate参数限制匹配类型,比如validate='1:1'确保一对一匹配,若存在一对多则直接报错:
    subset_merge = subset_df1.merge(subset_df2, how='outer', indicator=True, validate='1:1')
    

内容的提问来源于stack exchange,提问作者vasanth kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:22:03