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,速度快很多。

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