仅对同一组内的值进行模糊匹配

Fuzzy matching only for values within same group

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

我有两个数据框:

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)

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

建立一个应用程序的限制列表。使用 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