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

如何在Pandas Merge中避免冗余重复,实现1:1数据比对

Pandas Merge 避免不必要数据重复的解决方案

问题场景

使用Pandas的merge操作比对两个DataFrame时,因关联键(code/name/date)存在重复值,结果产生大量冗余行,无法实现1:1的记录比对需求。

原始代码

import pandas
df1 = pandas.DataFrame(
    {
        'code': ['001', '001'],
        'name': ['test1', 'test1'],
        'date': ['2024-01-01', '2024-01-01'],
        'value1': [1, 2],
        'value2': [1, 2],
        'sum': [2, 4]
    }
)
df2 = pandas.DataFrame(
    {
        'code': ['001', '001', '001', '002'],
        'name': ['test1', 'test1', 'test1', 'test2'],
        'date': ['2024-01-01', '2024-01-01', '2024-01-01', '2024-02-01'],
        'value1': [1, 2, 3, 4],
        'value2': [1, 2, 3, 4],
        'sum': [2, 4, 6, 8]
    }
)
result = pandas.merge(df1, df2, on=['code', 'name', 'date'], how='outer', indicator=True)
print(result[['code', 'name', 'date', 'sum_x', 'sum_y', '_merge']])

当前输出

code   name        date  sum_x  sum_y      _merge
0  001  test1  2024-01-01    2.0      2        both
1  001  test1  2024-01-01    2.0      4        both
2  001  test1  2024-01-01    2.0      6        both
3  001  test1  2024-01-01    4.0      2        both
4  001  test1  2024-01-01    4.0      4        both
5  001  test1  2024-01-01    4.0      6        both
6  002  test2  2024-02-01    NaN      8  right_only

预期输出

code   name        date  sum_x  sum_y      _merge
0  001  test1  2024-01-01      2      2        both
1  001  test1  2024-01-01      4      4        both
2  001  test1  2024-01-01    NaN      6        right_only
3  002  test2  2024-02-01    NaN      8  right_only

解决方案

重复行的核心原因是:仅用code/name/date作为关联键时,两个DataFrame内存在多个同键记录,merge会生成所有可能的组合(笛卡尔积)。要实现1:1比对,需为同键记录添加唯一标识,确保每行精准匹配。

方法一:添加分组序号作为关联键

  1. 为两个DataFrame按code/name/date分组,生成组内自增序号:
df1['seq'] = df1.groupby(['code', 'name', 'date']).cumcount()
df2['seq'] = df2.groupby(['code', 'name', 'date']).cumcount()
  1. 使用包含序号的完整键执行merge,后移除序号列:
result = pandas.merge(df1, df2, on=['code', 'name', 'date', 'seq'], how='outer', indicator=True)
final_result = result[['code', 'name', 'date', 'sum_x', 'sum_y', '_merge']]
print(final_result)

方法二:用业务唯一字段扩展关联键

如果业务逻辑中sum(或value1/value2)是记录的唯一标识,可直接将其加入关联键:

result = pandas.merge(df1, df2, on=['code', 'name', 'date', 'sum'], how='outer', indicator=True)
print(result[['code', 'name', 'date', 'sum_x', 'sum_y', '_merge']])

两种方法均可得到预期输出,方法一适用于无明确业务唯一字段的场景,方法二更贴合业务逻辑但需确保字段的唯一性。

内容的提问来源于stack exchange,提问作者다크매터

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 08:08:28