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

Python中按列/行值匹配合并两个独立DataFrame的最优方法

解决方案

这个场景直接使用pandas内置的merge左连接即可实现,无需手写for循环,逻辑更清晰也不容易出错:

  • 核心逻辑:以dt1为左表、dt2为右表,用colA、colB、colC三列作为匹配关联键,左连接会完整保留dt1的所有行,匹配到dt2对应行时自动带出dt2的colD值,未匹配的位置自动填充空值。

完整实现代码

import pandas as pd

# ---------------------- 以下为示例测试数据,替换为你实际的dt1、dt2即可 ----------------------
dt1 = pd.DataFrame({
    'colA': [1, 2, 3, 4],
    'colB': ['x', 'y', 'z', 'm'],
    'colC': [100, 200, 300, 400],
    'colD': ['dt1_val1', 'dt1_val2', 'dt1_val3', 'dt1_val4']
})
dt2 = pd.DataFrame({
    'colA': [1, 3],
    'colB': ['x', 'z'],
    'colC': [100, 300],
    'colD': ['dt2_val1', 'dt2_val3']
})
# -------------------------------------------------------------------------------------

# 核心匹配逻辑
dt3 = dt1.merge(
    # 仅取dt2需要的列,减少冗余计算
    dt2[['colA', 'colB', 'colC', 'colD']],
    # 三列同时作为匹配键
    on=['colA', 'colB', 'colC'],
    # 左连接,完整保留dt1的所有行
    how='left',
    # 重命名重复的colD列,dt1的colD保留原名,dt2的colD重命名为colD_dt2
    suffixes=('', '_dt2')
)

结果说明

生成的dt3会完整保留dt1的所有行和原有列,新增的colD_dt2就是匹配结果:

  • 三列值匹配成功的行,colD_dt2为dt2对应行的colD值
  • 匹配失败的行,colD_dt2自动填充空值(NaN)

如果需要直接用dt2的colD替换dt1的colD,未匹配留空,可追加以下代码:

dt3['colD'] = dt3['colD_dt2']
dt3 = dt3.drop('colD_dt2', axis=1)

提示:内置merge方法做了底层优化,大数据量下执行效率远高于手写for循环遍历校验。


内容的提问来源于stack exchange,提问作者nbafan249

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:15:05