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
相关产品推荐
相关产品推荐

