如何基于多列合并两个pandas DataFrame且避免生成重复行
多公共键分组非唯一值场景下的DataFrame紧凑合并方案
核心问题:直接使用pd.merge按(A,B,C)三列合并时,若同一(A,B,C)分组在两张表中都有多条记录,会生成笛卡尔积(左表m行 × 右表n行),导致大量重复冗余行。
解决思路
给每张表的同一个(A,B,C)分组内的行添加组内顺序编号,合并时将(A,B,C)+组内编号共同作为合并键,即可实现同组val0、val1按顺序一一对应,无匹配值自动留空,不会产生笛卡尔积。
实现代码
# 给df1的每个(A,B,C)分组添加组内自增序号 df1['grp_idx'] = df1.groupby(['A','B','C']).cumcount() # 给df2的每个(A,B,C)分组添加组内自增序号 df2['grp_idx'] = df2.groupby(['A','B','C']).cumcount() # 按公共键合并,之后删除辅助序号列 res = pd.merge(df1, df2, how='outer', on=['A','B','C','grp_idx']).drop('grp_idx', axis=1) # 可选:将NaN替换为空字符串,匹配你期望的输出格式 res = res.fillna('')
效果说明
生成的结果完全符合需求:
- 同一(A,B,C)分组下的val0、val1紧凑排列,无重复值
- 两张表中独有的(A,B,C)分组也会完整保留,对应缺失字段留空
- 不会产生笛卡尔积冗余行
内容的提问来源于stack exchange,提问作者Vineet
相关产品推荐
相关产品推荐

