You need to enable JavaScript to run this app. 合并两个Pandas DataFrame后出现重复行该如何处理?
优惠活动
大模型
产品
解决方案
定价
更多

合并两个Pandas DataFrame后出现重复行该如何处理?

合并产生重复行的核心原因

你使用的合并键['Year', 'ID']在两个表中都不是唯一主键:

  • 支出表expenses中,同Year+ID的组合对应2条不同Expense的记录
  • 收入表revenues中,同Year+ID的组合对应5条不同Name、Revenue的记录

pandas的inner join逻辑是,左表的每一行都会匹配右表所有符合合并键条件的行,最终结果行数就是左表匹配行数 × 右表匹配行数,这里就是2×5=10行,属于多对多匹配产生的笛卡尔积结果,不是数据重复导致的,所以你用drop_duplicates无法解决——不管是去重原表还是去重合后的表,这些行的字段值本身就有差异,不属于完全重复的行。

正确处理方案

根据你的业务需求选择对应方案即可:

方案1:先聚合支出表再合并(最常用)

如果你的业务逻辑是同一个Year+ID下的支出需要汇总后再关联收入明细,先对支出表按合并键做聚合:

# 示例为求和,可根据需求替换为mean、max等聚合函数
expenses_agg = expenses.groupby(['Year', 'ID'], as_index=False)['Expense'].sum()
# 再做合并
df_final = pd.merge(expenses_agg, revenues, on=['Year', 'ID'], how='inner')

此时每个Year+ID在左表只有1条记录,合并后结果行数和收入表的匹配行数一致,不会产生额外重复。

方案2:补充关联字段后合并

如果支出表的每条记录实际上对应收入表的某一个Name,你需要先给支出表补充Name字段,再将Name加入合并键,实现一对一匹配:

# 给expenses补完Name字段后执行合并
df_final = pd.merge(expenses, revenues, on=['Year', 'ID', 'Name'], how='inner')

方案3:先聚合收入表再合并

如果你的需求是关联同Year+ID的总支出和总收入,那同时聚合两个表再合并即可:

expenses_agg = expenses.groupby(['Year', 'ID'], as_index=False)['Expense'].sum()
revenues_agg = revenues.groupby(['Year', 'ID'], as_index=False)['Revenue'].sum()
df_final = pd.merge(expenses_agg, revenues_agg, on=['Year', 'ID'], how='inner')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 11:51:03