合并两个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
相关产品推荐
相关产品推荐

