Pandas 处理自由文本拼写相似列值合并为大分组的方法咨询
文本拼写归一化实现方案
核心思路
优先通过出现频次筛选候选正确值,仅对低频值和更高频的候选值做编辑距离匹配,避免全量两两计算的性能损耗,完美适配你“高频值为正确拼写,相似低频值映射到高频值”的需求。
分步实现(Python)
- 第一步:先做基础数据清洗,统计所有取值的出现频次
import pandas as pd # 优先用C实现的Levenshtein库,比fuzzywuzzy纯Python实现快10~100倍 from Levenshtein import distance # 假设你的数据集存储在df变量中,目标列名为Diagnosis # 先做基础清洗:统一转小写、去除首尾空格、特殊符号 df['Diagnosis'] = df['Diagnosis'].str.lower().str.strip() # 统计所有唯一值的出现频次 value_counts = df['Diagnosis'].value_counts().reset_index() value_counts.columns = ['text', 'count']
- 第二步:设置合理的编辑距离阈值,建议按文本长度动态调整,比如长度<5的阈值设为1,长度≥5的设为2,避免短文本误匹配
- 第三步:构建映射字典,仅低频值和比它频次更高的候选计算距离,大幅减少无效计算
# 按频次降序排列,排在前面的为优先级更高的正确值候选 sorted_texts = value_counts.sort_values('count', ascending=False)['text'].tolist() mapping = {} # 可根据业务场景调整阈值 fixed_threshold = 2 for i, standard_text in enumerate(sorted_texts): if standard_text in mapping: continue # 仅遍历排在当前值之后的更低频文本 for low_freq_text in sorted_texts[i+1:]: if low_freq_text in mapping: continue # 计算编辑距离 if distance(standard_text, low_freq_text) <= fixed_threshold: mapping[low_freq_text] = standard_text # 未匹配到的文本默认映射到自身 for text in sorted_texts: if text not in mapping: mapping[text] = text
- 第四步:把映射规则应用到原数据集
df['cleaned_Diagnosis'] = df['Diagnosis'].map(mapping)
额外优化建议
如果你的唯一值量级超过1000,可以先按n-gram做分桶,只有共享n个相同字符片段的文本才计算距离,能进一步提升计算效率。
内容的提问来源于stack exchange,提问作者Scorks
相关产品推荐
相关产品推荐

