我正在使用pandas数据帧,我有数据,我每个公司都有客户。但是,公司的标题略有不同,但最终会影响数据。 例如:
Company Customers
AAAB 1,000
AAAB Inc. 900
The AAAB Inc. 20
AAAB the INC 10
我希望从拥有非标准名称的公司的几家不同公司的数据库中获取总客户数。知道我应该从哪里开始吗?
答案 0 :(得分:7)
我记得关于this blog(正在查看fuzzywuzzy library)阅读another question,这可以做到这一点:
pip install fuzzywuzzy
您可以使用其partial_ratio函数“模糊匹配”字符串:
In [11]: from fuzzywuzzy.fuzz import partial_ratio
In [12]: partial_ratio('AAAB', 'the AAAB inc.')
Out[12]: 100
这似乎有信心它是一个很好的匹配!
In [13]: partial_ratio('AAAB', 'AAPL')
Out[13]: 50
In [14]: partial_ratio('AAAB', 'Google')
Out[14]: 0
我们可以在实际的公司列表中取得最佳匹配(假设您拥有它):
In [15]: co_list = ['AAAB', 'AAPL', 'GOOG']
In [16]: df.Company.apply(lambda mistyped_co: max(co_list,
key=lambda co: partial_ratio(mistyped_co, co)))
Out[16]:
0 AAAB
1 AAAB
2 AAAB
3 AAAB
Name: Company, dtype: object
我强烈怀疑scikit学习或numpy库中的某些内容可以更有效地在大型数据集上执行此操作......但这应该可以完成工作。
如果你没有公司名单,你可能需要做一些更聪明的事情......
答案 1 :(得分:1)
splitCompaniesSet = map( lambda cmpnyName :
set( map( lambda name : name.split(" "), cmpnyName ) ), dataFrame['Company'] )
我认为这是对的。
基本上创建一个集合列表,每个集合都有公司名称拆分。然后,从第一个元素开始,找到该元素的每个其他元素的set intersection。对于每个非空交叉点,将名称更改为最简单的匹配 在所有非空结果集中,即与所有非空集相交一个集合,并将结果设置为所有非空匹配的公司名称。
然后转到下一个与第一个公司名称相交时导致空集的Company
。然后对下一个Company
执行此操作,该{{1}}对于您尝试的前两个空是空的,依此类推。
但是,这可能是一种更有效的方法。
答案 2 :(得分:0)
使用matplotlib
尝试以下代码:-
pip install cleanco
预期输出:-
from cleanco import prepare_terms, basename
business_name = "The AAAB Inc."
terms = prepare_terms()
basename(business_name, terms, prefix=False, middle=False, suffix=True)