如何用fuzzywuzzy清洗Pandas列中的多变体公司名称?
解决方法
步骤1:安装依赖库
先确保安装所需工具库:
pip install pandas fuzzywuzzy python-Levenshtein
步骤2:核心代码实现
以下是完整处理逻辑,核心思路是优先用最短的公司名称作为匹配标准,通过模糊匹配将变体名称统一替换:
import pandas as pd from fuzzywuzzy import process # 原始数据 company = ['Canopy Growth', 'Canopy Growth Chocolates', 'Canopy growTH', 'Aurora', 'Aurora Drift', 'Aurora Corp', 'Hexo Corp', 'HEXO', 'hexo Inc', 'Pure Sunfarms', 'Pure sunfarms Corp'] df = pd.DataFrame({'company': company}) # 生成候选标准名:去重后按字符长度升序排序,确保最短名称优先作为匹配目标 unique_companies = sorted(df['company'].unique(), key=lambda x: len(x)) # 定义模糊匹配函数,可调整匹配阈值(默认80,分数越高匹配越严格) def match_standard_name(name, candidates, threshold=80): match, score = process.extractOne(name, candidates) return match if score >= threshold else name # 应用函数生成清洗后的列 df['clean_company'] = df['company'].apply(lambda x: match_standard_name(x, unique_companies)) print(df)
代码说明
sorted(..., key=lambda x: len(x)):将唯一名称按长度排序,保证最短的名称被优先选为标准匹配项process.extractOne:从候选列表中找出与当前名称相似度最高的结果,返回匹配项和相似度分数- 阈值
threshold:可根据实际名称变体的差异程度调整,比如变体差异大时调低阈值,要求精准匹配时调高 - 若匹配分数低于阈值,默认返回原名称,你也可以根据需求改为标记未匹配等处理方式
运行结果
执行后会得到你期望的清洗结果:
| company | clean_company | |
|---|---|---|
| 0 | Canopy Growth | Canopy Growth |
| 1 | Canopy Growth Chocolates | Canopy Growth |
| 2 | Canopy growTH | Canopy Growth |
| 3 | Aurora | Aurora |
| 4 | Aurora Drift | Aurora |
| 5 | Aurora Corp | Aurora |
| 6 | Hexo Corp | HEXO |
| 7 | HEXO | HEXO |
| 8 | hexo Inc | HEXO |
| 9 | Pure Sunfarms | Pure Sunfarms |
| 10 | Pure sunfarms Corp | Pure Sunfarms |
内容的提问来源于stack exchange,提问作者Alejandro L
相关产品推荐
相关产品推荐

