如何用Levenshtein距离修正Pandas数据框列中的拼写错误?
修正Pandas单列姓名拼写错误的解决方案
下面提供两种基于相似度匹配的实现方案,分别使用Levenshtein距离和模糊匹配方法来统一拼写错误的姓名。
方法一:基于Levenshtein距离的聚类替换
Levenshtein距离(编辑距离)可以衡量两个字符串的差异程度,我们通过设定阈值将相似姓名聚类,并用每类中出现频率最高的姓名作为标准名替换。
步骤与代码
- 安装依赖库:
pip install pandas python-Levenshtein
- 实现代码:
import pandas as pd from Levenshtein import distance from collections import defaultdict # 初始化数据框 df = pd.DataFrame({'NAME': ['robert', 'robert', 'robrt', 'marie', 'ann']}) def cluster_similar_names(names, threshold=2): # 按姓名出现频率降序排列,优先用高频姓名作为聚类基准 name_counts = names.value_counts().sort_values(ascending=False) clusters = defaultdict(list) used_names = set() for base_name in name_counts.index: if base_name in used_names: continue # 筛选所有与基准名编辑距离小于等于阈值的姓名 cluster_members = [name for name in names.unique() if distance(base_name, name) <= threshold] for name in cluster_members: used_names.add(name) clusters[base_name].append(name) return clusters # 生成姓名聚类映射 name_clusters = cluster_similar_names(df['NAME']) name_mapping = {} for standard_name, variants in name_clusters.items(): for variant in variants: name_mapping[variant] = standard_name # 替换原数据中的姓名 df['NAME'] = df['NAME'].map(name_mapping) print(df)
运行后输出结果:
NAME 0 robert 1 robert 2 robert 3 marie 4 ann
方法二:使用fuzzywuzzy进行模糊匹配替换
fuzzywuzzy库可直接计算字符串相似度,并返回最匹配的结果,适合快速实现姓名修正。
步骤与代码
- 安装依赖库:
pip install pandas fuzzywuzzy python-Levenshtein
- 实现代码:
import pandas as pd from fuzzywuzzy import process # 初始化数据框 df = pd.DataFrame({'NAME': ['robert', 'robert', 'robrt', 'marie', 'ann']}) # 提取出现频率最高的姓名作为候选匹配集 candidate_names = df['NAME'].value_counts().index.tolist() def correct_name(name): # 匹配最相似的候选姓名,设定相似度阈值(80分) match, similarity_score = process.extractOne(name, candidate_names) return match if similarity_score >= 80 else name # 批量修正姓名 df['NAME'] = df['NAME'].apply(correct_name) print(df)
注意事项
- 阈值调整:根据姓名长度和错误类型调整阈值,短姓名建议设较小阈值(如1-2),长姓名可适当提高;模糊匹配的相似度阈值可根据需求调整(通常70-90)。
- 基准优先级:优先用出现频率高的姓名作为基准,避免将正确姓名替换为错误变体。
- 性能优化:如果数据量较大,建议先对姓名去重后计算相似度,减少不必要的计算。
内容的提问来源于stack exchange,提问作者eggcheesestickscorn
相关产品推荐
相关产品推荐

