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

如何基于字段后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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:18:20