从公司名称中获取后缀列表

Posted

技术标签:

【中文标题】从公司名称中获取后缀列表【英文标题】:Getting a list of suffixes from the company names 【发布时间】:2017-02-24 05:54:35 【问题描述】:

我有一个列名为公司的数据框 df。公司名称的几个例子是:ABC Inc.、XYZ Gmbh、PQR Ltd、JKL Limited 等。我想要一个所有后缀的列表(Inc.、Gmbh、Ltd.、Limited 等)。请注意,后缀长度总是不同的。可能有些公司没有任何后缀,例如:Apple。我需要所有公司名称中所有后缀的完整列表,列表中只保留唯一的后缀。

我该如何完成这项任务?

【问题讨论】:

您对某事物作为后缀的判断标准是什么?即,你怎么知道JKL Limited 中的Limited 是后缀,而The CarPhoneHouse 中的CarPhoneHouse 不是? @Anaphory 这是我的挑战。我想从公司名称中删除所有后缀。因此,完整字符串中最后一个空格之后的单词可能是后缀。我只想要唯一的列表。我可以手动取出 CarPhoneHouse 之类的词。如果您有更好的方法,请提出建议。 附注:公司全名是“Apple Inc.”。 @KlausD。你是对的。但是我的数据有很多错误。我刚才举了一个例子来说明可能有很多公司没有任何后缀。 【参考方案1】:

您可以为此使用cleanco Python 库,其中包含所有可能的后缀的list。例如。它包含您提供的所有示例(Inc, Gmbh, Ltd, Limited)。

因此您可以从库中获取后缀并将它们用作字典来搜索您的数据,例如:

import pandas as pd
company_names = pd.Series(["Apple", "ABS LLC", "Animusoft Corp", "A GMBH"])
suffixes = ["llc", "corp", "abc"]  # take from cleanco source code
found = [any(company_names.map(lambda x: x.lower().endswith(' ' + suffix))) for suffix in suffixes]
suffixes_found = [suffix for (suffix, suffix_found) in zip(suffixes, found) if suffix_found]
print suffixes_found  # outputs ['llc', 'corp']

【讨论】:

【参考方案2】:

这仅在公司名称有多个您需要的单词时添加后缀。

company_names = ["Apple", "ABS LLC", "Animusoft Corp"]
suffixes = [name.split()[-1] for name in company_names if len(name.split()) > 1]

现在考虑到这不包括独特的要求。 这不包括您可以拥有一家名为“Be Smart”的公司,并且“Smart”不是后缀,而是名称的一部分。但是,这需要满足独特的要求:

company_names = ["Apple", "ABS LLC", "Animusoft Corp", "BBC Corp"]
suffixes = []
for name in company_names:
    if len(name.split()) > 1 and name.split()[-1] not in suffixes:      
        suffixes.append(name.split()[-1])

【讨论】:

【参考方案3】:

试试这个:

In [36]: df
Out[36]:
         Company
0         Google
1      Apple Inc
2  Microsoft Inc
3       ABC Inc.
4       XYZ Gmbh
5        PQR Ltd
6    JKL Limited

In [37]: df.Company.str.extract(r'\s+([^\s]+$)', expand=False).dropna().unique()
Out[37]: array(['Inc', 'Inc.', 'Gmbh', 'Ltd', 'Limited'], dtype=object)

或忽略标点符号:

In [38]: import string

In [39]: df.Company.str.replace('['+string.punctuation+']+','')
Out[39]:
0           Google
1        Apple Inc
2    Microsoft Inc
3          ABC Inc
4         XYZ Gmbh
5          PQR Ltd
6      JKL Limited
Name: Company, dtype: object

In [40]: df.Company.str.replace('['+string.punctuation+']+','').str.extract(r'\s+([^\s]+$)', expand=False).dropna().unique()
Out[40]: array(['Inc', 'Gmbh', 'Ltd', 'Limited'], dtype=object)

将结果导出到 Excel 文件中:

data = df.Company.str.replace('['+string.punctuation+']+','').str.extract(r'\s+([^\s]+$)', expand=False).dropna().unique()
res = pd.DataFrame(data, columns=['Comp_suffix'])
res.to_excel(r'/path/to/file.xlsx', index=False)

【讨论】:

这看起来很棒@MaxU 这给了我这样的输出 - array([u'Inc', u'Management', u'ZAO', ..., u'Ltd'], dtype=object .可能'u'代表unicode。我可以在上面的代码中做些什么改变来摆脱这个'u'。另外,因为我的数据很大,有没有办法以更易读的格式获得这个输出,可能是excel . @user6461192,你可以简单地忽略那些u - 它只是unicode字符串的表示。我已经用export to Excel 扩展了我的答案 - 请检查【参考方案4】:

所以你想要公司名称的最后一个单词,假设公司的名称超过一个单词?

set(name_list[-1] for name_list in map(str.split, company_names) if len(name_list) > 1)

[-1] 获得了最后的发言权。 str.split 分割空格。我从未使用过 pandas,所以获得company_names 可能是其中最难的部分。

【讨论】:

我已经弄清楚如何取出最后一个单词,但我无法添加每个公司的长度应大于1个单词的条件。给你 - df["suffix"] = df["Company"].str.split().str[-1] df['Company']所有的名字吗?在那种情况下,你可以把它放在我上面有company_names的地方 如果我这样做,它会给我以下错误 - TypeError: descriptor 'split' requires a 'str' object but received a 'unicode' 您使用的是哪个版本的 Python? 2 中的编码很奇怪。也许用map(lambda x: str(x).split(), company_names) 代替?我承认我对 2 没有太多经验

以上是关于从公司名称中获取后缀列表的主要内容,如果未能解决你的问题,请参考以下文章

通过公司名称获取公司关键词

澳大利亚公司后缀名称Pty.Ltd和Co.Ltd的区别

destoon获取公司名称首尾文字方法

如何从python中的股票代码或公司名称获取股票市场公司部门

Firebase 实时数据库:如何迭代每个键值

动态连接多个数据库