Pandas多列存储匹配值时合并DataFrame出现全NaN问题
解决多列匹配的DataFrame合并问题
嘿,我来帮你搞定这个合并的问题~你现在遇到的问题是因为merge的写法逻辑错了,咱们一步步来拆解:
为什么你的代码返回全NaN?
你写的这段合并代码:
merged = pd.merge(df, df1, how='left', left_on=['NUMBER', 'NUMBER', 'NUMBER'], right_on=['CODE', 'CODE1', 'CODE2'])
是在做多键同时匹配——它要求df里的NUMBER必须同时等于df1里的CODE、CODE1、CODE2这三个列的对应值,但你的数据里根本没有哪一行满足这个条件,所以结果全是NaN,这显然不是你要的“匹配任意一个CODE列”的逻辑。
正确的解决方案
我们需要把df1里分散在三个列的CODE值整合到一列,再和df合并,这里推荐用melt函数来转格式,效率高且逻辑清晰:
方法1:转成长格式后合并(推荐)
import pandas as pd import numpy as np # 你的原始数据 d1 = {'CODE': ['BBLGLC70M',np.nan, np.nan, np.nan, np.nan], 'CODE1': [np.nan, np.nan, np.nan, 'AALGLC71P', np.nan], 'CODE2': ['BBLG', np.nan, 'ZZTNRD77', 'PRI', np.nan], 'DESC': ['OK', 'FALSE', 'YES', 'OK', 'NO'] } df1 = pd.DataFrame(d1) df = {'NUMBER': ['BBLGLC70M', 'AALGLC71P', 'ZZTNRD77'] } df = pd.DataFrame(df) # 将df1的CODE/CODE1/CODE2列转成单列,保留DESC关联 df1_melted = df1.melt( id_vars=['DESC'], # 保留DESC作为关联字段 value_vars=['CODE', 'CODE1', 'CODE2'], # 要转换的CODE列 value_name='MATCH_CODE' # 转换后的列名 ).dropna(subset=['MATCH_CODE']) # 去掉空值 # 执行合并 merged = pd.merge(df, df1_melted, how='left', left_on='NUMBER', right_on='MATCH_CODE') # 移除不需要的辅助列 merged = merged.drop(columns=['variable']) print(merged)
运行后你会得到期望的结果:
NUMBER DESC 0 BBLGLC70M OK 1 AALGLC71P OK 2 ZZTNRD77 YES
方法2:用apply逐行匹配(适合小数据集)
如果你的数据量不大,也可以用apply函数直接遍历匹配:
def get_matching_desc(number): # 遍历df1的每一行,检查number是否在该行的CODE列中 for _, row in df1.iterrows(): if number in [row['CODE'], row['CODE1'], row['CODE2']]: return row['DESC'] return np.nan # 给df添加DESC列 df['DESC'] = df['NUMBER'].apply(get_matching_desc) print(df)
这个方法逻辑直观,但数据量大的时候效率会比方法1低一些。
内容的提问来源于stack exchange,提问作者Caiotru
相关产品推荐
相关产品推荐

