如何优化代码实现仅同一国家代码组内的公司名称模糊匹配
优化FuzzyWuzzy匹配:仅在相同国家代码的公司间进行模糊匹配
我完全懂你的痛点——当前的代码会把dfA的每个公司和dfB里所有公司做匹配,哪怕国家代码完全不同,很容易出现跨国家的错误匹配结果。下面是针对性的改进方案,核心是先按国家代码分组,只在同组内做模糊匹配,既精准又能提升效率。
先看完整的改进代码
首先我们先构造示例数据(方便你直接测试),然后给出匹配逻辑:
import pandas as pd from fuzzywuzzy import process, fuzz # 构造你的示例数据 dfA = pd.DataFrame({ "Company": ["CompanyA", "CompanyB", "CompanyC", "CompanyD"], "Country Code": ["IT", "DE", "DE", "SE"] }) dfB = pd.DataFrame({ "Company": ["Company A", "Company B", "Company C", "Company D"], "Country Code": ["IT", "DE", "DE", "SE"] }) # 关键预处理:把dfB按国家代码分组,转成字典(键=国家代码,值=对应公司列表) country_company_map = dfB.groupby("Country Code")["Company"].apply(list).to_dict() actual_name = [] similarity = [] # 遍历dfA的每一行,只匹配同国家的公司 for _, row in dfA.iterrows(): current_company = row["Company"] current_country = row["Country Code"] # 获取当前国家对应的所有dfB公司 target_companies = country_company_map.get(current_country, []) if target_companies: # 仅在同国家范围内做模糊匹配,extractOne直接返回最佳匹配结果 best_match = process.extractOne(current_company, target_companies) actual_name.append(best_match[0]) similarity.append(best_match[1]) else: # 处理dfB中没有当前国家公司的情况,返回空值和0分 actual_name.append(None) similarity.append(0) # 把结果合并回dfA dfA['actual_name'] = actual_name dfA['similarity'] = similarity
核心改进点说明
- 分组预处理:提前把dfB按
Country Code分组并转成字典,这样每次匹配时不用全表扫描dfB,直接通过国家代码快速定位目标公司列表,数据量越大,效率提升越明显。 - 同组匹配逻辑:遍历dfA时,只取出和当前公司国家代码一致的dfB公司列表进行匹配,从根源上避免跨国家的无效匹配。
- 简洁的匹配方法:用
process.extractOne替代process.extract(limit=1),直接返回最佳匹配结果,代码更简洁。 - 异常兜底:如果dfB中没有当前国家的公司,返回
None和0分,避免程序报错。
可选优化(针对大数据量)
如果你的DataFrame行数很多,建议更换更快的评分器,比如fuzz.QRatio(比默认的fuzz.WRatio速度更快,效果差异不大):
best_match = process.extractOne(current_company, target_companies, scorer=fuzz.QRatio)
内容的提问来源于stack exchange,提问作者C_An
相关产品推荐
相关产品推荐

