如何基于另一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
相关产品推荐
相关产品推荐

