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

pandas如何查找列中带额外单词的重复公司名称值

实现方案

直接用「独立单词移除+分组计数」的逻辑就能实现,不需要复杂模糊匹配,运行效率高,也不会误删本身带canada的独立主体:
核心判断逻辑:

  • 对每个公司名称,仅移除作为独立单词存在的canada,清理多余空格后生成匹配键
  • 统计每个匹配键的出现次数,只有出现次数≥2的匹配键对应的原始名称,才是存在关联的同主体公司
  • 出现次数=1的匹配键,不管原名带不带canada,都属于独立主体,不需要修改

可直接运行的代码

import pandas as pd
import re

# 示例数据构造
namelist = ['canadian pacific railway',
 'nestlé canada',
 'nestlé',
 'chicken farmers of canada',
 'cenovus energy',
 'merck frosst canada',
 'food banks canada',
 'canadian fertilizer institute',
 'balanceco',
 'bell textron canada',
 'safran landing systems canada',
 'airbus canada',
 'airbus',
 'investment counsel association of canada',
 'teck resources',
 'fertilizer canada',
 'engineers canada',
 'google',
 'google canada']
s = pd.Series(namelist, name='company_name')

# 生成匹配键函数
def gen_match_key(name):
    # 用单词边界\b匹配独立的canada,避免误替换canadian这类同根词
    key = re.sub(r'\bcanada\b', '', name, flags=re.IGNORECASE)
    # 清理替换后残留的多余空格、首尾空格
    key = re.sub(r'\s+', ' ', key).strip()
    return key

# 处理流程
df = s.to_frame()
df['match_key'] = df['company_name'].apply(gen_match_key)
# 统计每个匹配键的出现频次
key_freq = df['match_key'].value_counts()
# 筛选存在关联重复的行
duplicate_related = df[df['match_key'].isin(key_freq[key_freq >= 2].index)]

运行结果

duplicate_related['company_name']的输出和预期完全一致:

1     nestlé canada
2            nestlé
12    airbus canada
13           airbus
17           google
18    google canada
Name: company_name, dtype: object

后续标准化操作

如果要把同主体名称统一,直接按match_key分组赋值即可,比如统一取不带canada的名称作为标准名:

# 同一匹配键下,优先选长度短的(即不带canada的)作为标准名
df['standard_name'] = df.groupby('match_key')['company_name'].transform(lambda x: x.str.len().idxmin())
df['standard_name'] = df.loc[df['standard_name'], 'company_name'].values

这个逻辑不会误处理fertilizer canada、engineers canada这类独立主体——因为它们的匹配键在全量数据里只出现1次,标准名会和原名保持一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:48:22