如何基于字段后4位匹配合并pandas DataFrame并解决重复问题
pandas按字段后4位合并两表、避免重复行方案
问题根因
之前合并出现行数和df2一致但大量重复的核心原因有三个:
- 没有提前生成统一的精确匹配键,直接做模糊匹配或字段不等值匹配触发了隐式笛卡尔积
- 未校验小表(451行的df1)匹配键的唯一性,如果后4位存在重复值,会触发一对多匹配生成重复行
- 合并时没有明确指定连接类型和关联字段,pandas自动匹配同名字段导致逻辑偏差
实现步骤
1. 生成统一匹配键
两个字段先统一转字符串,再截取最后4位作为关联键,避免数值/字符串类型不一致导致匹配失败:
# df1是包含pack_number的451行小表 df1['match_key'] = df1['pack_number'].astype(str).str.strip().str[-4:] # df2是包含ROOT_VIN的10.8万行大表 df2['match_key'] = df2['ROOT_VIN'].astype(str).str.strip().str[-4:]
加
str.strip()是为了去除字段首尾可能存在的空格,避免因为隐形空格导致匹配不上
2. 校验小表匹配键唯一性
因为df1仅451行,正常每个pack_number后4位应该唯一,先做去重校验避免一对多重复:
dup_count = df1['match_key'].duplicated().sum() if dup_count > 0: # 业务无特殊要求直接去重,保留第一条记录即可 df1 = df1.drop_duplicates(subset='match_key', keep='first')
3. 执行合并
以df2为左表做左连接,既保留df2全部10.8万行数据,又不会出现行数膨胀:
# 只选取df1需要带入的列,避免冗余字段 df1_need = df1[['match_key', 'pack_number', 'col1', 'col2', 'col3', 'col4', 'col5', 'col6']] # 替换col1-col6为你实际需要合并的6个列名 merge_result = pd.merge( left=df2, right=df1_need, on='match_key', how='left' ) # 删掉临时匹配键 merge_result = merge_result.drop(columns=['match_key'])
结果校验
- 合并后总行数和原df2完全一致,为10.8万行,不会出现重复行膨胀
- 未匹配到对应pack_number的行,pack_number及附属6列值为
NaN,符合左连接逻辑 - 如果只需要保留匹配成功的行,把合并参数
how='left'改为how='inner'即可
内容的提问来源于stack exchange,提问作者ashleybee
相关产品推荐
相关产品推荐

