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

Pandas表关联异常:ID x与x+1错误匹配问题求助

ID关联错位匹配问题的解决方案

问题场景

尝试基于ID列关联两个数据表,ID格式为“ABCxxx”(xxx为三位数字):

  • df1的ID列是规范的三位数字字符串(如'001')
  • df2的ID嵌入在长字符串中,需先提取
    关联时出现异常:df1的ID x会匹配到df2的ID x+1,推测是df2的ID提取后类型转换环节出错。

错误原因分析

  • 正则表达式错误:原代码用(ABC\\d+\\d+\\d+),\d+会匹配1个或多个数字,重复三次会错误匹配多余字符(比如ABCDE293这类字符串会被错误识别),无法精准提取ABC后的三位数字。
  • 冗余拆分逻辑:原代码用str.split('C')拆分提取的ABCxxx,不仅多余,还可能因字符串格式问题导致提取结果异常。
  • 关联方法选择不当:df.join()默认按索引关联,用on='ID'时易出现匹配逻辑混淆,不如merge适合列与列的关联场景。

修正后的代码

import pandas as pd

data1 = {
    'ID': ['001','002','003', '004','005'],
    'test': [10,20,30,40,50]
}
df1 = pd.DataFrame(data1)

data2 = {
    'ID': ['30942_ABC001_43424','45323_ABC001_45932','ABC002_94853_23948','ABC002_29304_90400','48958_34856_ABC003', '49384_ABCDE293_48593','28394_XYZ123_38485'],
    'score': [10,20,30,40,50,60,70]
}
df2 = pd.DataFrame(data2)

# 精准提取ABC后的三位数字ID,过滤不符合格式的行
df2['ID'] = df2['ID'].str.extract('ABC(\d{3})', expand=True)
# 移除提取后ID为空的行(即不符合ABCxxx格式的行)
df2 = df2.dropna(subset=['ID'])

# 统一转换为int类型(或保持字符串类型也可,只要两边一致)
df1['ID'] = df1['ID'].astype(int)
df2['ID'] = df2['ID'].astype(int)

# 使用merge进行列关联,更直观可靠
joined_table = df1.merge(df2, on='ID', how='left')
print(joined_table)

代码说明

  • 正则ABC(\d{3})精准匹配ABC后紧跟的三位数字,直接提取目标ID部分,无需后续拆分。
  • 用dropna移除提取失败的行,避免无效数据干扰关联。
  • 使用merge替代join,明确按ID列进行关联,匹配逻辑更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 02:07:14