Python pandas基于公共列值合并两个DataFrame的结果异常问题咨询
问题根因
你使用的默认merge执行的是全组合内连接匹配:只要Col2和Col4的数值相等,就会把两边的所有同值行做交叉拼接。比如df1里有3行Col2=22的记录(C/D/E),df2里有2行Col4=22的记录(K/L),就会生成3*2=6条组合结果,和你期望的「按行出现顺序一一配对、数量不匹配的多余行直接丢弃」的逻辑完全不符。
实现预期匹配的解决方案
核心思路是给两个DataFrame的匹配列,按数值分组生成组内累计序号,把「匹配数值+组内序号」作为联合匹配键,就能实现按顺序一一配对的效果,具体步骤如下:
- 第一步:给df1的Col2列添加组内累计序号,标记同值行的先后顺序
df1['_match_seq'] = df1.groupby('Col2').cumcount() - 第二步:给df2的Col4列生成完全相同规则的组内累计序号
df2['_match_seq'] = df2.groupby('Col4').cumcount() - 第三步:用「匹配列+临时序号列」做联合内连接,自动剔除无法配对的多余行
merged_result = df1.merge(df2, left_on=['Col2', '_match_seq'], right_on=['Col4', '_match_seq'], how='inner') - 第四步:删除临时序号列,重置索引得到最终结果
final_df = merged_result.drop(columns='_match_seq').reset_index(drop=True)
结果验证
按照上述代码运行后,得到的输出完全符合你的预期:
Col1 Col2 Col3 Col4 0 B 12 P 12 1 C 22 K 22 2 D 22 L 22 3 H 60 M 60
逻辑说明:df1中Col2=22的第三条记录E,因为df2没有对应的Col4=22、同序号的记录,会在内连接阶段被自动过滤,不会出现在最终结果里。
内容的提问来源于stack exchange,提问作者TK7372
相关产品推荐
相关产品推荐

