仅对同一组内的值进行模糊匹配
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
我遇到了这个问题,应该有一个简单的解决方案,但我找不到。
我有两个数据框:
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