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

Pandas merge模拟Excel VLOOKUP 结果与Excel不一致记录数偏多

问题原因

merge后行数异常增加来自两个明确的代码错误,和merge函数本身的参数配置无关:

1. replace方法的inplace参数使用错误

你代码中这一行是核心诱因:

rmNulls['marketing_event_id'] = rmNulls['marketing_event_id'].replace('',0, inplace = True)
  • pandas中带inplace=True参数的方法会直接修改原对象,返回值为None
  • 你将这个None赋值回marketing_event_id列后,整列值会被覆盖为None,后续转字符串后整列都是'None',关联时会匹配到右表中所有SrcCode为'None'的行,直接造成行数膨胀
  • 这行的正确写法二选一即可:
# 方式1:不使用inplace,接收方法返回值
rmNulls['marketing_event_id'] = rmNulls['marketing_event_id'].replace('',0)
# 方式2:使用inplace时不要做赋值操作
rmNulls['marketing_event_id'].replace('',0, inplace=True)

2. 右表关联键存在重复值,未对齐VLOOKUP的匹配逻辑

Excel VLOOKUP在精确匹配模式下,找到第一个符合条件的结果就会停止匹配,单条左表记录最多返回一条结果。但pandas的merge是全量笛卡尔匹配:如果右表refDetails的SrcCode列存在重复值,左表1条记录会匹配到右表N条重复记录,最终结果行数必然超过原左表行数。
先运行以下代码检查右表重复值:

# 输出所有SrcCode重复的记录
print(refDetails[refDetails.duplicated('SrcCode', keep=False)].sort_values('SrcCode'))

确认存在重复后,先对右表按关联键去重、保留每个键的第一条记录,再做merge即可完全对齐VLOOKUP逻辑:

# 去重:每个SrcCode仅保留第一条记录
refDetails_unique = refDetails.drop_duplicates(subset='SrcCode', keep='first')
# 用去重后的表做左连接
df3 = pd.merge(rmNulls, refDetails_unique, left_on="marketing_event_id", right_on='SrcCode', how='left')
修正后可直接运行的代码
import pandas as pd

rmNulls = pd.read_csv(r"File1.csv", converters={'marketing_event_id': lambda x: str(x)})
# 修正replace的inplace使用错误
rmNulls['marketing_event_id'].replace('', 0, inplace=True)
rmNulls["marketing_event_id"] = rmNulls["marketing_event_id"].astype(str)

details = pd.read_excel(r"DetailAttr.xlsx", "Details", dtype=str)
refDetails = details[['SrcCode','New Minor Cat']].copy()
refDetails["SrcCode"] = refDetails["SrcCode"].astype(str)
# 右表去重对齐VLOOKUP逻辑
refDetails = refDetails.drop_duplicates(subset='SrcCode', keep='first')

print("Vlookup in Progress")
df3 = pd.merge(rmNulls, refDetails, left_on="marketing_event_id", right_on='SrcCode', how='left')

with pd.ExcelWriter('DW 150622.xlsx', date_format='DD-MM-YYYY', datetime_format='DD-MM-YYYY' ) as writer:
    # 增加index=False避免导出多余的行索引列
    df3.to_excel(writer, index=False)

补充说明:导出Excel时建议加上index=False参数,否则pandas会默认将行索引作为单独一列写入文件,产生冗余数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:36:10