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
相关产品推荐
相关产品推荐

