
本文介绍如何基于 df1 中的标准词汇表,通过正则表达式在 df2 中模糊匹配(忽略大小写、支持子串/全词匹配),并安全替换为规范值,适用于拼写纠错、标准化命名等场景。
本文介绍如何基于 df1 中的标准词汇表,通过正则表达式在 df2 中模糊匹配(忽略大小写、支持子串/全词匹配),并安全替换为规范值,适用于拼写纠错、标准化命名等场景。
在数据清洗中,常遇到「参考标准表修正另一张表字段」的需求:df1 提供权威、规范的关键词集合(如品类名、品牌名),而 df2 中对应列存在大小写混杂、拼写变形或冗余字符等问题。直接 merge 会因不完全匹配失败,而逐行循环效率低下。更优解是构建可扩展的正则模式,利用 pandas 的向量化字符串操作高效完成映射。
核心思路是:将 df1['col1'] 中所有唯一值构造成一个 OR 分组正则表达式,并启用忽略大小写(re.I)标志,在 df2['col1'] 中进行提取(str.extract)。该方法天然支持部分匹配(如 'bnapple' → 'apple'),且保留原始行结构,不丢失其他列数据。
以下是完整实现代码:
import pandas as pd
import re
df1 = pd.DataFrame({'col1': ['apple', 'banana', 'cherry', 'apple', 'cherry']})
df2 = pd.DataFrame({'col1': ['app Banana', 'Cherry', 'banana', 'apple', 'bnapple', 'apple ch']})
# 步骤1:构建安全正则模式(自动转义特殊字符)
pattern = r'({})'.format('|'.join(map(re.escape, df1['col1'].unique())))
# 步骤2:在 df2 中提取首个匹配项(忽略大小写)
df2['col1_corrected'] = df2['col1'].str.extract(pattern, flags=re.I, expand=False)
# 可选:统一转为小写以对齐 df1 的规范形式(若 df1 本身大小写一致)
df2['col1_corrected'] = df2['col1_corrected'].str.lower()
print(df2[['col1', 'col1_corrected']])
输出结果:
col1 col1_corrected 0 app Banana banana 1 Cherry cherry 2 banana banana 3 apple apple 4 bnapple apple 5 apple ch apple
⚠️ 注意事项:
- re.escape 防止 df1 中含正则元字符(如 ., *, ()导致匹配异常;
- str.extract(..., expand=False) 返回 Series 而非 DataFrame,便于直接赋值;
- 若需仅匹配完整单词(避免 'pineapple' 错误匹配为 'apple'),请改用带词界符的模式:r'\b({})\b'.format(...);
- 若 df1 中存在空值或重复模式,建议提前清洗:df1['col1'].dropna().unique();
- 该方案不依赖索引对齐,也不改变 df2 行数与顺序,兼容性极强。
此方法兼具简洁性、可读性与鲁棒性,是处理“模糊关键词映射”类任务的推荐实践。











