如何使用正则匹配不同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
相关产品推荐
相关产品推荐

