【问题标题】:Fuzzy matching only for values within same group仅对同一组内的值进行模糊匹配
【发布时间】:2021-08-19 12:40:15
【问题描述】:

我被这个问题困住了,应该有一个简单的解决方案,但我找不到它。

我有两个数据框:

dfA

Company Country Code
CompanyA IT
CompanyB DE
CompanyC DE
CompanyD SE

dfB

Company Country Code
Company A IT
Company B DE
Company C DE
Company D SE

Dataframe B 包含公司名称的正确拼写,因此我尝试使用fuzzywuzzy 库进行匹配。到目前为止,我得到了很好的相似度分数,但我想通过仅比较具有相同国家代码的公司来进一步提高它们。

这是我目前一直在运行的代码:

import pandas as pd
from fuzzywuzzy import process, fuzz

actual_name = []
similarity = []

for i in dfA["Company"]:
        ratio = process.extract( i, dfB["Company"], limit=1)
        actual_name.append(ratio[0][0])
        similarity.append(ratio[0][1])
        
dfA['actual_name'] = pd.Series(actual_name)
dfA['similarity'] = pd.Series(similarity)

如何改进我的代码,以便仅当 i dfA["Country Code"] == dfB["Country Code"] 时才比较公司名称?

【问题讨论】:

  • 最简单的解决方案是先遍历国家代码,按国家代码过滤数据,然后对过滤后的数据集进行模糊匹配。
  • 您好,感谢您的意见。主要问题是我的编码技能不是那么先进。我试图写一些东西,但我的代码永远不会工作。你有什么建议/链接我可以检查一下吗?

标签: python pandas fuzzywuzzy


【解决方案1】:

建立一个限制性列表来应用该流程。使用extractOne(...) 而不是extract(...)[0] 只能得到一个值。

dfA['Company List'] = pd.merge(dfA, dfB, on='Country Code', how='left') \
                        .groupby('Company_x')['Company_y'] \
                        .apply(list).values

dfA[['actual_name', 'similarity']] = \
    dfA.apply(lambda x: process.extractOne(x['Company'],
                                           x['Company List']), axis=1) \
       .apply(pd.Series)

输出

>>> dfA
    Company Country Code            Company List actual_name  similarity
0  CompanyA           IT             [Company A]   Company A          94
1  CompanyB           DE  [Company B, Company C]   Company B          94
2  CompanyC           DE  [Company B, Company C]   Company C          94
3  CompanyD           SE             [Company D]   Company D          94

【讨论】:

  • 有趣的解决方案,但我有一个可扩展性的问题。我有数百家公司,无法将它们都列在一个列表中……您认为我可以以某种方式重新调整此解决方案吗?
  • 不知道问题出在哪里?您是否根据真实数据测试解决方案?
猜你喜欢
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 2010-10-29
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多