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

如何基于另一Pandas DataFrame实现Excel Vlookup效果的字段扩充

Pandas 实现类VLOOKUP数据扩充的优化方案

你原本的双重循环写法时间复杂度为O(n*m),数据量稍大就会出现明显的性能问题,同时代码还存在笔误:赋值语句使用了比较运算符==,会导致匹配成功后也无法给新列正确赋值。

Pandas内置的矢量化运算可以完美替代循环操作,性能比Python层循环高2~3个数量级,以下是两种常用的实现方案:

方案1:merge左连接(兼容性最强,支持多字段匹配)

该方案逻辑完全等价于Excel的VLOOKUP,默认保留df1的全部行,匹配不到的值自动填充NaN:

import pandas as pd  

df1 = pd.read_csv(xxx)  
df2 = pd.read_csv(xxx)  

# 可选:如果df2的匹配列filter_2有重复值,先去重,仅保留第一个匹配项
df2 = df2.drop_duplicates(subset="filter_2", keep="first")

# 左连接匹配
df1 = df1.merge(
    # 仅保留df2需要用到的列,减少内存占用
    df2[["filter_2", "Theneededvalue"]],
    left_on="filter_1", # df1的匹配列
    right_on="filter_2", # df2的匹配列
    how="left" # 左连接,保留df1全部行
)

# 重命名列为需求的列名,删除多余的匹配列
df1 = df1.rename(columns={"Theneededvalue": "Enrich"}).drop(columns=["filter_2"])
# 可选:把匹配不到的NaN替换为空字符串,和你原逻辑保持一致
df1["Enrich"] = df1["Enrich"].fillna("")

如果是多字段匹配的场景,只需要给left_on和right_on传入列名列表即可,例如left_on=["col1", "col2"], right_on=["col_a", "col_b"]。

方案2:map映射(单字段匹配场景更简洁)

如果仅需要单字段匹配取单列值,用map方法代码更精简:

import pandas as pd  

df1 = pd.read_csv(xxx)  
df2 = pd.read_csv(xxx)  

# 生成匹配映射字典
match_dict = df2.set_index("filter_2")["Theneededvalue"]
# 映射匹配填充新列
df1["Enrich"] = df1["filter_1"].map(match_dict).fillna("")

性能说明

对于10万行级别的数据集,双重循环通常需要数分钟才能跑完,而上述两种方案执行时间基本在毫秒级,核心原因是Pandas的内置运算都是在C层面执行,完全避免了Python层的循环开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 23:12:02