我的知识记录

Python Excel多表关联 Vlookup用pandas merge实现

用pandas的merge替代Excel Vlookup,支持左连接、右连接、内连接,按主键把另一张表的字段拼过来,多列关联一次搞定。

场景痛点

订单表里只有商品编码,要把商品名称、单价从商品档案表带过来;或者员工表里只有部门编号,要带上部门名称。Excel里写 VLOOKUP 又长又脆,列号一改全错。pandas的merge一行代码完成,还能多列联合匹配。

用到的库

pip install pandas openpyxl

完整代码

import pandas as pd

def vlookup_demo():
# 模拟:订单表 + 商品档案表
orders = pd.DataFrame({
"订单号": ["A001", "A002", "A003", "A004"],
"商品编码": ["P01", "P02", "P01", "P99"],
"数量": [10, 5, 3, 8]
})
products = pd.DataFrame({
"商品编码": ["P01", "P02", "P03"],
"商品名称": ["键盘", "鼠标", "显示器"],
"单价": [199, 99, 1299]
})

# 1. 左连接:保留订单表所有行,匹配不到的商品信息为空(最常用,等价Vlookup)
left_join = orders.merge(products, on="商品编码", how="left")

# 2. 内连接:只保留两边都能匹配上的
inner_join = orders.merge(products, on="商品编码", how="inner")

# 3. 多列联合匹配:on 传列表
# orders.merge(products, on=["商品编码", "仓库"], how="left")

# 4. 列名不一样时:left_on / right_on
# orders.merge(products, left_on="商品编码", right_on="编码", how="left")

# 计算金额
left_join["金额"] = left_join["数量"] * left_join["单价"]

left_join.to_excel("./Vlookup结果.xlsx", index=False)
print(left_join)
print(f"\n左连接结果{len(left_join)}行,内连接结果{len(inner_join)}行")

if __name__ == "__main__":
vlookup_demo()

代码讲解

  • merge(left, right, on="商品编码", how="left"):以orders为主表,把products里同编码的行拼过来,等价Excel的Vlookup。
  • how="left" 左连接,订单表里有但商品表没有的编码(如P99),商品名称和单价列留空。
  • how="inner" 内连接,只保留两边都能匹配上的行,P99会被丢弃。
  • left_on / right_on 在两表关联列名不同时使用。
  • 拼完直接算 金额 = 数量 * 单价,一步到位。

运行结果

打印并保存 Vlookup结果.xlsx,左连接结果包含4条订单(P99的商品名称/单价为空),内连接结果只有3条。

注意事项

  • 商品档案表里同一编码如果有多行,merge会产生多行笛卡尔积,先 drop_duplicates("商品编码") 去重。
  • 关联列类型要一致,一边是字符串"001"一边是数字1,会匹配不上,先 astype(str)
  • 大表merge内存占用高,先只保留需要的列再merge,速度快很多。

Python Excel多表关联 Vlookup用pandas merge实现

标签:

更新时间:2026-09-15 09:02:57

上一篇:Python Excel写入公式并读取计算结果方法详解

下一篇:Python Excel从多个工作簿汇总到一张总表