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

如何使用正则匹配不同DataFrame的ID列并返回True/False结果

实现方案

问题根因

isin()返回全False的核心原因是两表ID列的值没有完全对齐,常见诱因包括:某列ID带前后隐形空白、两列ID数据类型不一致(一列是字符串一列是数值)、同个ID在两表里存在全角半角/多余分隔符差异,和方法本身逻辑无关。

正则匹配实现步骤

核心逻辑是先统一清洗两表ID格式,再将DF2的有效ID拼接为正则完全匹配规则,逐行校验DF1的ID是否命中规则。

  • 导入依赖并定义ID清洗函数,统一ID格式
import pandas as pd
import re

def clean_id(id_val):
    if pd.isna(id_val):
        return ""
    # 仅保留ID中的字母、数字,剔除所有无关符号、前后空白
    return re.sub(r'[^A-Za-z0-9]', '', str(id_val).strip())
  • 对两表的ID列做统一清洗
DF1["clean_id"] = DF1["ID"].apply(clean_id)
DF2["clean_id"] = DF2["ID"].apply(clean_id)
  • 构造正则完全匹配规则
# 提取DF2中去重后的非空有效ID
valid_id_list = DF2[DF2["clean_id"] != ""]["clean_id"].unique().tolist()
# 拼接正则规则,^匹配字符串开头、$匹配字符串结尾,|表示或逻辑,re.escape转义特殊字符
id_match_pattern = re.compile(r'^(' + '|'.join(map(re.escape, valid_id_list)) + r')$')
  • 逐行匹配返回布尔结果
DF1["is_id_exists_in_df2"] = DF1["clean_id"].apply(lambda x: bool(id_match_pattern.fullmatch(x)))

注意事项

  • 清洗步骤可以根据你的实际数据格式调整,如果确认所有ID无多余脏字符,可以跳过清洗步骤直接用原始ID构造正则。
  • 正则匹配默认做完全等值匹配,不会出现短ID误命中长ID的问题。
  • 百万级以上数据量场景下,该方法效率略低于集合查找,但日常十万到百万级数据处理速度无明显瓶颈。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:21:23