【发布时间】:2019-03-08 22:26:32
【问题描述】:
我正在尝试在充满组织名称的 PANDAS 列中查找潜在匹配项。我目前正在使用 iterrows() 但它在大约 70,000 行的数据帧上非常慢。在查看了 StackOverflow 之后,我尝试实现一个 lambda 行(应用)方法,但这似乎几乎没有加快速度,如果有的话。
数据框的前四行如下所示:
index org_name
0 cliftonlarsonallen llp minneapolis MN
1 loeb and troper llp newyork NY
2 dauby o'connor and zaleski llc carmel IN
3 wegner cpas llp madison WI
以下代码块有效,但需要大约五天的时间来处理:
org_list = df['org_name']
from fuzzywuzzy import process
for index, row in df.iterrows():
x = process.extract(row['org_name'], org_list, limit=2)[1]
if x[1]>93:
df.loc[index, 'fuzzy_match'] = x[0]
df.loc[index, 'fuzzy_match_score'] = x[1]
实际上,对于每一行,我将组织名称与所有组织名称的列表进行比较,取前两个匹配项,然后选择第二好的匹配项(因为顶部匹配项将是相同的名称),然后设置分数必须高于 93 才能创建新列的条件。我创建附加列的原因是我不想简单地替换值——我想先仔细检查结果。
有没有办法加快速度?我阅读了几篇关于“矢量化”此代码的博客文章和 StackOverflow 问题,但我的尝试失败了。我还考虑过简单地创建一个 70,000 x 70,000 Levenshtein 距离矩阵,然后从那里提取信息。是否有更快的方法为列表或 PANDAS 列中的每个元素生成最佳匹配?
【问题讨论】:
-
所以对于每一行,您想使用该行的
org_name列作为您的查询,然后使用完整的org_name列中的整个组织名称列表作为您的匹配选项? -
是的,没错。
标签: python pandas performance fuzzywuzzy