我正在使用熊猫数据框,并且我有每个公司都有客户的数据。但是,公司名称略有不同,但最终会影响数据。例子:
Company Customers
AAAB 1,000
AAAB Inc. 900
The AAAB Inc. 20
AAAB the INC 10
我想从几个不同公司的数据库中获取所有客户,这些公司的名称不是标准的。知道我应该从哪里开始吗?
我记得读过这个关于fuzzywuzzy 库的博客(研究另一个问题),它可以做到这一点:
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 learn 或 numpy 库中有一些东西可以在大型数据集上更有效地执行此操作……但这应该可以完成工作。
如果你没有公司名单,你可能不得不做一些更聪明的事情......
splitCompaniesSet = map( lambda cmpnyName :
set( map( lambda name : name.split(" "), cmpnyName ) ), dataFrame['Company'] )
我认为这是对的。
基本上创建一个集合列表,每个集合都有公司名称拆分。然后,从第一个元素开始,找到每个其他元素与那个元素的集合交集。对于每个非空交集,将名称更改为所有非空结果集之间最简单的匹配,即与所有非空集再取一个集交集,并将结果设置为所有非空集的公司名称空匹配。
然后继续下一个Company
,当与第一个公司名称相交时导致一个空集。然后为Company
您尝试的前两个为空的下一个执行此操作,依此类推。
不过,可能有一种更有效的方法来做到这一点。
利用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)
预期输出:-
The AAAB