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

在Python Pandas中不使用MERGE实现VLOOKUP功能的技术问题

解决DataFrame的类VLOOKUP匹配问题(避免merge)

问题回顾

你需要用DF1的key对应值填充DF2中value为空的行,同时保留DF2已有的正确值;且因两个DF的key可能存在NULL,不想用merge避免意外匹配。

错误原因

你之前的代码报错KeyError: False,是因为DF2['key'].equals(DF1['key'])是整列对比,返回单个布尔值(比如False),而loc需要的是索引或逐行布尔数组,用单个False索引自然会出错。

正确解法

方法1:map结合np.where处理NULL和已有值

先把DF1转成key-value字典,再逐行匹配,同时保留DF2原有非空值:

import pandas as pd
import numpy as np

# 创建示例DataFrame
DF1 = pd.DataFrame({'key': ['aaa', 'bbb', 'ccc'], 'value': [111, 222, 333]})
DF2 = pd.DataFrame({'key': ['bbb', 'ccc', 'aaa', 'aaa'], 'value': [None, 333, None, 111]})

# 构建key到value的映射字典
key_map = DF1.set_index('key')['value'].to_dict()

# 填充DF2的value:key非空时用map匹配,匹配不到或key为空则保留原value
DF2['value'] = np.where(
    DF2['key'].notna(),
    DF2['key'].map(key_map).fillna(DF2['value']),
    DF2['value']
)

print(DF2)

输出结果:

key  value
0   bbb    222
1   ccc    333
2   aaa    111
3   aaa    111

方法2:apply逐行判断(更直观)

如果觉得np.where不够直观,也可以用apply逐行处理:

DF2['value'] = DF2.apply(
    lambda row: key_map.get(row['key'], row['value']) if pd.notnull(row['key']) else row['value'],
    axis=1
)

说明

  • 两种方法都会保留DF2中key为NULL的行的原有value,不会像merge那样产生意外连接行;
  • key_map.get(row['key'], row['value'])确保如果DF1中没有对应key,会保留DF2原有值,避免出现NaN。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:15:34