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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:42:29