如何使用Pandas匹配两个DataFrame多列并映射对应值到目标列
问题原因
你之前的匹配逻辑存在两个错误:
- 关联字段匹配错误:你把df1的
col_a、col_b和df2的col_1、col_2做关联,但需求是df1的col_a、col_b要和df2的col_2、col_3匹配 - 关联方式选择错误:
outer关联会保留两个表的所有行,所以会出现半行空值的拆分结果,你需要保留df1的全部行,应该用left左关联
实现代码
import pandas as pd import numpy as np # 先处理df2,只保留需要的关联字段和结果字段,避免冗余列 df2_use = df2[['col_2','col_3','e_values']] # 左关联匹配,关联键对应正确的字段 df_result = pd.merge( df1.drop(columns=['e_values']), # 删掉df1原有的空e_values列,避免冲突 df2_use, how='left', left_on=['col_a','col_b'], right_on=['col_2','col_3'] ) # 填充未匹配的行,以下两种填充方式按需选其一即可 # 方式1:填充固定无匹配标识 df_result['e_values'] = df_result['e_values'].fillna('no match, random list of values') # 方式2:填充随机列表值 # df_result['e_values'] = df_result['e_values'].apply(lambda x: x if pd.notna(x) else list(np.random.rand(3))) # 删掉多余的关联字段,得到最终结果 df_result = df_result.drop(columns=['col_2','col_3'])
逻辑说明
- 关联前先精简df2,只保留需要用到的关联列和取值列,避免最终结果出现多余的无用字段
- 左关联
how='left'可以100%保留df1的所有行结构,不会出现额外拆分的空行 - 最终通过
fillna或者apply自定义未匹配行的填充逻辑,完全符合预期输出要求
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

