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

如何用字符串相似度技术在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)

代码说明

  1. 映射字典构建:通过process.extract一次性获取所有相似度达标的公司名称,批量建立映射,避免了循环替换的逻辑漏洞,比原始代码更稳定。
  2. 标准名称选择:默认取第一个匹配项作为标准名称,可根据需求调整规则:
    • 选最长名称: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])
      
  3. 高效统计:使用Pandas内置的nunique()和value_counts()完成统计,比手动循环求和更简洁高效。

输出结果

运行代码后会得到:

合并后唯一公司数量:3

各公司出现次数:
Aba             3
Mars            2
Marcipan        1
Name: Standard_Company, dtype: int64

内容的提问来源于stack exchange,提问作者d8888d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:13:18