如何在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比对,需为同键记录添加唯一标识,确保每行精准匹配。
方法一:添加分组序号作为关联键
- 为两个DataFrame按
code/name/date分组,生成组内自增序号:
df1['seq'] = df1.groupby(['code', 'name', 'date']).cumcount() df2['seq'] = df2.groupby(['code', 'name', 'date']).cumcount()
- 使用包含序号的完整键执行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,提问作者다크매터
相关产品推荐
相关产品推荐

