如何用字符串相似度技术在Pandas中匹配公司名并统计唯一值
在Pandas中通过字符串相似度匹配公司名称并统计唯一数量
问题概述
需要对Pandas DataFrame的「Company」列进行相似名称匹配,将如「Aba」「aba electronics」「Aba kon」视为同一家公司,「Mars」和「Mars coli」视为同一家,最终统计合并后的唯一公司数量及各公司出现次数。
数据示例
import pandas as pd data = pd.DataFrame( { "Company": [ "Aba", "aba electronics", "Marcipan", "Mars", "Mars coli", "Aba kon", ], "People": [ "Aba2", "aba electronics3", "Marcipan4", "Mars5", "Mars coli6", "Aba kon7", ], } )
解决方案
使用模糊字符串匹配库(如fuzzywuzzy或性能更优的rapidfuzz)构建公司名称映射关系,将相似名称统一到同一标准名称下,再通过Pandas内置方法完成统计。
步骤1:安装依赖
# 使用fuzzywuzzy(需依赖python-Levenshtein提升性能) pip install fuzzywuzzy python-Levenshtein # 或使用更快的替代库rapidfuzz pip install rapidfuzz
步骤2:优化后的匹配与统计代码
import pandas as pd # 选择其中一个导入即可 from fuzzywuzzy import fuzz, process # from rapidfuzz import fuzz, process # 加载数据 data = pd.DataFrame( { "Company": ["Aba", "aba electronics", "Marcipan", "Mars", "Mars coli", "Aba kon"], "People": ["Aba2", "aba electronics3", "Marcipan4", "Mars5", "Mars coli6", "Aba kon7"], } ) # 设置相似度阈值(可根据需求调整) cutoff = 80 # 获取所有唯一公司名称 unique_companies = data["Company"].unique() # 构建相似公司到标准名称的映射字典 company_mapping = {} for company in unique_companies: if company not in company_mapping: # 提取所有相似度达标匹配项 matches = process.extract(company, unique_companies, scorer=fuzz.token_sort_ratio, score_cutoff=cutoff) # 选择第一个匹配项作为标准名称,也可改为最长名称/出现次数最多的名称 standard_name = matches[0][0] # 将所有匹配到的公司映射到标准名称 for match, _, _ in matches: company_mapping[match] = standard_name # 为DataFrame添加统一后的标准公司名列 data["Standard_Company"] = data["Company"].map(company_mapping) # 统计结果 unique_company_count = data["Standard_Company"].nunique() company_appearance_counts = data["Standard_Company"].value_counts() # 输出结果 print(f"合并后唯一公司数量:{unique_company_count}") print("\n各公司出现次数:") print(company_appearance_counts)
代码说明
- 映射字典构建:通过
process.extract一次性获取所有相似度达标的公司名称,批量建立映射,避免了循环替换的逻辑漏洞,比原始代码更稳定。 - 标准名称选择:默认取第一个匹配项作为标准名称,可根据需求调整规则:
- 选最长名称:
standard_name = max([match for match, _, _ in matches], key=len) - 选出现次数最多的名称:
counts = data["Company"].value_counts() standard_name = max([match for match, _, _ in matches], key=lambda x: counts[x])
- 选最长名称:
- 高效统计:使用Pandas内置的
nunique()和value_counts()完成统计,比手动循环求和更简洁高效。
输出结果
运行代码后会得到:
合并后唯一公司数量:3 各公司出现次数: Aba 3 Mars 2 Marcipan 1 Name: Standard_Company, dtype: int64
内容的提问来源于stack exchange,提问作者d8888d
相关产品推荐
相关产品推荐

