首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Pandas中的列中查找相似的短语

在Pandas中的列中查找相似的短语
EN

Stack Overflow用户
提问于 2020-03-18 05:58:16
回答 2查看 1.3K关注 0票数 1

我正在使用Pandas处理一个数据框架,该数据框架有一列公司名称。

对于每个公司名称,它都有几个版本。df是一个例子:

代码语言:javascript
复制
df = pd.DataFrame({'id':['a','b','c','d','e','f'],'company name':['name1', ' Name1 LTD', 'name1, ltd.','name 1 LT.D.',' name2 p.p.c', 'name2 ppc.']})

我想知道是否有一种简单的方法可以找到相似的名称并为它们分配一个唯一的id?对于上面的示例,我希望获得如下内容:

代码语言:javascript
复制
dg = pd.DataFrame({'id':['a','a','a','a','e','e'],'company name':['name1', ' Name1 LTD', 'name1, ltd.','name 1 LT.D.',' name2 p.p.c', 'name2 ppc.']})

谢谢,

EN

回答 2

Stack Overflow用户

发布于 2020-03-18 07:04:39

我做过的一件事就是使用regex或一个处理原始字符串的函数,去掉所有多余的字符串,比如ltd和任意的特殊字符。然后创建一个经过处理的字符串,即它们的“真名”,并基于“真名”创建id的索引。

或者,您可以使用fuzzywuzzy查找两个字符串之间的距离,构建候选匹配集,并基于匹配分数构建唯一名称的索引。

代码语言:javascript
复制
def clean_str(x):
    x2 = x.lower()
    x2 = x2.replace('.', '')
    return x2
票数 1
EN

Stack Overflow用户

发布于 2020-03-18 09:01:01

我觉得你的问题,就像任何编程问题一样,需要被分解成更小的部分。我将按照我的理解和方法一步一步地分析这一点。

步骤1.清理(统一)您的company name值。这里有一篇关于data cleansing的好文章,以及为什么它很重要。

步骤2.基于唯一的公司名称映射您的id (完成步骤1后,此步骤很容易)

代码语言:javascript
复制
import pandas as pd

df = pd.DataFrame({'id':['a','b','c','d','e','f'],'company_name':['na,me1', ' Name1 LTD', 'name1, ltd.','name 1 LT.D.',' name2 p.p.c', 'name2 ppc.']})

步骤1.

通过结合使用extractregex来清理它

请记住,下面的regex仅捕获您提供的小样本,您可能需要设计模式以使用完整的数据集

代码语言:javascript
复制
df['new_company_name'] = (df['company_name']
                         .str.lower()                    # lowercase to standardize
                         .str.replace(' |,','')          # remove extra characters, this may vary for your full dataset
                         .str.extract(r'^(\w+\d{1})'))   # pattern to extract the vital part of the name, this also will vary based on your data

print(df)

  id  company_name new_company_name
0  a         name1            name1
1  b     Name1 LTD            name1
2  c   name1, ltd.            name1
3  d  name 1 LT.D.            name1
4  e   name2 p.p.c            name2
5  f    name2 ppc.            name2

步骤2

出于性能考虑,建议使用数值而不是str

选项1将groupby()ngroup()结合使用

代码语言:javascript
复制
df['new_id'] = df.groupby('new_company_name').ngroup()

选项2使用zip()__、dict()__,然后使用map()

代码语言:javascript
复制
unique_names = df.new_company_name.unique()
mapper = dict(
    zip(unique_names,
        [name_id for name_id in range(len(unique_names))]
    )
)
df['new_id'] = df['new_company_name'].map(mapper)

选项1或选项2的结果相同

代码语言:javascript
复制
print(df)

  id  company_name new_company_name  new_id
0  a         name1            name1       0
1  b     Name1 LTD            name1       0
2  c   name1, ltd.            name1       0
3  d  name 1 LT.D.            name1       0
4  e   name2 p.p.c            name2       1
5  f    name2 ppc.            name2       1

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60730827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档