You need to enable JavaScript to run this app. Python pandas基于公共列值合并两个DataFrame的结果异常问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 15:45:09