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

