python - 在 pandas 中执行模糊字符串匹配的更快方法
问题描述
有什么方法可以在 pandas 中使用fuzzywuzzy 来加速模糊字符串匹配。
我有一个数据框,extra_names
其中包含我想与另一个数据框运行模糊匹配的名称names_df
。
>> extra_names.head()
not_matching
0 Vij Sales
1 Crom Electronics
2 REL Digital
3 Bajaj Elec
4 Reliance Digi
>> len(extra_names)
6500
>> names_df.head()
names types
0 Vijay Sales 1
1 Croma Electronics 1
2 Reliance Digital 2
3 Bajaj Electronics 2
4 Pai Electricals 2
>> len(names_df)
250
截至目前,我正在使用以下代码运行逻辑,但它需要很长时间才能完成。
choices = names_df['names'].unique().tolist()
def fuzzy_match(row):
best_match = process.extractOne(row, choices)
return best_match[0], best_match[1] if best_match else '',''
%%timeit
extra_names['best_match'], extra_names['match%'] = extra_names['not_matching'].apply(fuzzy_match)
当我发布这个问题时,查询仍在运行。有什么方法可以加快这个模糊字符串匹配过程吗?
解决方案
让我们试试difflib
:
import difflib
from functools import partial
f = partial(
difflib.get_close_matches, possibilities=names_df['names'].tolist(), n=1)
matches = extra_names['not_matching'].map(f).str[0].fillna('')
scores = [
difflib.SequenceMatcher(None, x, y).ratio()
for x, y in zip(matches, extra_names['not_matching'])
]
extra_names.assign(best=matches, score=scores)
not_matching best score
0 Vij Sales Vijay Sales 0.900000
1 Crom Electronics Croma Electronics 0.969697
2 REL Digital Reliance Digital 0.666667
3 Bajaj Elec Bajaj Electronics 0.740741
4 Reliance Digi Reliance Digital 0.896552
推荐阅读
- xml - 使用 Powershell 进行 XML 解析
- c# - 使用 C# 的非 WPF 或 Win32 应用程序的 UI 自动化
- javascript - javascript中require()函数的问题
- java - 具有多个线程的 Kafka Producer - Java
- kubernetes - 同一命名空间中的两个 Kubernetes 部署无法通信
- aws-sam - API 网关通过 SAM 直接连接到 SNS
- neo4j - EXISTS 带有动态标签的密码查询
- javascript - 我如何粗略地匹配 Javascript 中的两个字符串?
- java - 如何从 JobService 中调用 fusedLocationClient.getLastLocation()?
- python - 比较数据框中特定列行的长度,python