在熊猫中执行模糊字符串匹配的更快方法



有没有办法在熊猫中使用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

最新更新