如何修复Pandas DataFrame中存在拼写错误的字符串?
如何修复Pandas DataFrame中存在拼写错误的字符串?
看起来你已经抓住了问题的核心——这种拼写错误是固定模式:正确字符串末尾额外添加了3个随机字母。你的思路方向是对的,但代码里有些逻辑可以调整,让它更准确高效。咱们一步步来优化:
问题梳理
你的数据集里,正确的名称(比如"New York"、"Chicago")会多次出现,而错误变体只是在末尾多了3个随机字母,且出现次数更少。我们需要把这些变体映射回对应的正确名称。
优化后的代码方案
我调整了你的代码逻辑,优先处理高频出现的正确字符串,避免错误的反向替换,同时更精准地匹配末尾带3个随机字母的变体:
import pandas as pd from fuzzywuzzy import process # 留着备用,处理特殊情况 def fix_typos_smart(df, columns): for col in columns: if col not in df.columns: continue # 跳过不存在的列 # 确保所有值都是字符串,处理空值和首尾空格 df[col] = df[col].astype(str).str.strip() # 过滤掉空字符串(如果有的话) df = df[df[col] != ""] # 获取所有唯一值及其出现次数,按次数降序排列(优先处理高频正确值) value_counts = df[col].value_counts().sort_values(ascending=False) unique_values = value_counts.index.tolist() correction_map = {} # 第一步:处理高频正确值,匹配所有长度多3且开头完全匹配的变体 for correct_val in unique_values: if value_counts[correct_val] <= 1: continue # 只处理出现多次的疑似正确值 correct_len = len(correct_val) # 找所有长度比正确值多3,且开头完全匹配的变体 for typo_val in unique_values: if typo_val not in correction_map and len(typo_val) == correct_len + 3 and typo_val.startswith(correct_val): correction_map[typo_val] = correct_val # 第二步:处理未匹配的长字符串,提取前n-3位检查是否为高频值 unmatched = [val for val in unique_values if val not in correction_map and len(val) > 3] for typo_val in unmatched: candidate = typo_val[:-3] # 检查候选值是否存在且出现次数大于1 if candidate in value_counts and value_counts[candidate] > 1: correction_map[typo_val] = candidate # 第三步(可选):用模糊匹配处理剩余特殊情况 unmatched_remaining = [val for val in unique_values if val not in correction_map] for typo_val in unmatched_remaining: # 找最相似的高频值(相似度阈值设为80,可调整) match, score = process.extractOne(typo_val, unique_values, score_cutoff=80) if match: correction_map[typo_val] = match # 应用映射修正 df[col] = df[col].replace(correction_map) return df # 加载数据并处理 df = pd.read_csv("purchases.csv") columns_to_clean = ["City", "Name", "Store"] df = fix_typos_smart(df, columns_to_clean) # 保存修正后的数据 df.to_csv("purchasesfixed.csv", index=False)
代码解释
- 优先处理高频值:先从出现次数最多的字符串开始匹配,确保我们把错误变体映射到正确的高频值,而不是反过来。
- 精准匹配固定模式:只匹配长度比正确值多3且开头完全一致的变体,避免误替换其他相似字符串(比如把"New York City"错误替换成"New York")。
- 兜底模糊匹配:如果有些变体不符合固定模式(比如偶尔少加/多加字母),用
fuzzywuzzy的模糊匹配补充处理,提高覆盖率。 - 空值处理:提前处理空字符串和非字符串值,避免后续逻辑出错。
原代码未生效的可能原因
原代码里的第一个循环会把所有以某个高频词开头的字符串都替换,容易出现误替换;同时没有优先处理高频值,可能出现错误的映射方向。优化后的代码通过长度差3的条件和降序处理逻辑,完美贴合你的错误场景。
备注:内容来源于stack exchange,提问作者Jared Cage
相关产品推荐
相关产品推荐

