You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 20:19:29