如何使用Python清洗DataFrame中的姓名列并基于参考表标准化姓名?
高效清洗姓名并匹配参考表的解决方案
针对你的姓名清洗需求,结合参考表规模很小的特性,我们可以通过文本预处理+高效近似匹配的组合来实现,比单纯模糊匹配更高效,具体步骤如下:
步骤1:文本预处理
先统一姓名格式,减少不必要的变体差异,这能大幅降低后续匹配的复杂度:
- 转小写:消除大小写差异
- 去除非字母字符:比如去掉句号
.这类无关符号 - 压缩连续重复字符:把
adammm这类多重复字符的姓名简化为adam,进一步缩小和标准姓名的差距
import pandas as pd import re # 初始化你的数据 df = pd.DataFrame(columns=['Name']) df['Name'] = ['Aadam','adam','AdAm','adammm','Adam.','Bethh','beth.','beht','Beeth','Beth'] ref = pd.DataFrame(columns=['Cleaned Names']) ref['Cleaned Names'] = ['adam','beth'] # 预处理函数 def preprocess_name(name): # 转小写 name = name.lower() # 去除非字母字符 name = re.sub(r'[^a-z]', '', name) # 压缩连续重复字符(比如aaa→a) name = re.sub(r'(.)\1+', r'\1', name) return name # 应用预处理 df['Processed Name'] = df['Name'].apply(preprocess_name)
预处理后,df['Processed Name']的结果为:['aadam', 'adam', 'adam', 'adam', 'adam', 'beth', 'beth', 'beht', 'beth', 'beth']
步骤2:高效匹配参考表
因为参考表只有2个标准姓名,我们可以直接为每个预处理后的姓名计算与标准名的相似度,取相似度最高的结果即可。这里提供两种实现方式:
方法1:使用fuzzywuzzy(简洁高效)
fuzzywuzzy是专门做模糊匹配的工具,语法简洁,适合小规模场景:
from fuzzywuzzy import process # 定义匹配函数 def match_clean_name(name): # 从参考表中提取最匹配的姓名 match, score = process.extractOne(name, ref['Cleaned Names']) # 若需严格匹配可设置阈值(比如score>80才返回),这里数据差异小直接返回结果 return match df['Name Corrected'] = df['Processed Name'].apply(match_clean_name)
方法2:使用内置difflib(无需额外安装)
如果不想安装第三方库,用Python内置的difflib也能实现:
from difflib import SequenceMatcher def match_clean_name(name): max_score = 0 best_match = None for clean_name in ref['Cleaned Names']: score = SequenceMatcher(None, name, clean_name).ratio() if score > max_score: max_score = score best_match = clean_name return best_match df['Name Corrected'] = df['Processed Name'].apply(match_clean_name)
最终得到的df['Name Corrected']完全符合你的预期:['adam','adam','adam','adam','adam','beth','beth','beth','beth','beth']
效率说明
- 当参考表规模极小时(比如你的案例只有2个值),这种方法的效率远高于全量模糊匹配,因为每个姓名仅需和2个标准名计算相似度。
- 如果后续数据量扩大到十万级以上,可以换成
rapidfuzz(fuzzywuzzy的C语言实现版本),能进一步提升匹配速度。
内容的提问来源于stack exchange,提问作者Huey
相关产品推荐
相关产品推荐

