pandas的merge()函数最接近Excel VLOOKUP行为,通过how='left'和显式on参数实现左连接,保留左表全部行、右表无匹配则填NaN;支持多列匹配、不同列名连接(left_on/right_on),但需注意重复键导致笛卡尔积,右表应预先去重以对齐VLOOKUP仅返回首匹配的逻辑。

直接用 merge() 或 map(),别碰 lookup()(已弃用)和嵌套循环。
用 merge() 实现多列匹配与左连接
这是最接近 Excel VLOOKUP 行为的方案,尤其当你需要返回多个字段、处理重复键或保留左表全部行时。它本质是 SQL 的 LEFT JOIN。
- 默认行为是「左表全量保留,右表只取匹配项」,和 VLOOKUP 找不到就报
#N/A逻辑一致 - 必须显式指定
on=(单列)或left_on=/right_on=(列名不同),不传会按列名自动对齐,容易错 - 右表有重复键时,
merge()会生成笛卡尔积结果,而 Excel VLOOKUP 只返回第一个匹配——此时应先对右表去重:df_lookup.drop_duplicates(subset=['key_col'], keep='first') - 示例:
result = df_main.merge(df_lookup[['key', 'value']], on='key', how='left')
用 map() 快速单列映射
适合一对一映射、右表是 Series(如 df_lookup.set_index('key')['value']),性能比 merge() 高,且天然忽略重复键(只取最后一次出现值)。
-
map()返回NaN表示未匹配,和 VLOOKUP 的#N/A效果一致 - 不能直接映射多列;若需多字段,得多次
map()或改用merge() - 注意索引类型:如果
key是字符串但左表里混有数字,map()不会隐式转换,会全返回NaN - 示例:
df_main['value'] = df_main['key'].map(df_lookup.set_index('key')['value'])
为什么不用 lookup()?
lookup() 在 Pandas 1.2.0 中已被标记为弃用,1.4.0 起彻底移除。它设计初衷是行列位置查找(类似 Excel 的 INDEX+MATCH 组合),不是键值匹配,语义和 VLOOKUP 不符。
- 它依赖整数位置而非标签,输入
row_labels和col_labels会被强制转成位置索引,极易出错 - 不支持缺失值对齐,也不检查 key 是否存在,静默失败风险高
- 社区已明确推荐
merge()/map()/join()替代
真正难的不是选哪个函数,而是右表键是否干净:空格、大小写、数据类型不一致、隐藏控制字符——这些都会让 map() 全返回 NaN,merge() 匹配行数为 0,却不会报错提醒你。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











