在pandas数据框中快速执行模糊匹配两个字符串的最佳方法

6

我有两个数据框,它们的名称分别为“list”

df1[name]   -> number of rows 3000

df2[name]   -> number of rows 64000

我正在使用Fuzzy Wuzzy算法,并使用以下代码从df2中获取最佳匹配df1的条目:
```python ```
from fuzzywuzzy import fuzz
from fuzzywuzzy import process

matches = [process.extract(x, df1, limit=1) for x in df2]

但是这需要很长时间才能完成。有没有更快的方法在pandas中进行字符串模糊匹配?


2
这些名称是唯一的吗?如果不是,您可以通过缓存来加速。此外,您是否安装了python-levenshtein模块?那样可以大大提高速度(结果可能会略有不同)。 - Paulo Almeida
嘿@PauloAlmeida,是的,我已经添加了python-levenshtein模块。名称是唯一的。 - kunal deep
2个回答

5

我看到你的代码可以进行改进,可以使用生成器,所以代替方括号,你可以使用圆括号。这将使速度提高数倍。

matches = (process.extract(x, df1, limit=1) for x in df2)

编辑:还有一个建议,我们可以使用multiprocessing库并行化操作。


很高兴我能帮到你! - StatguyUser
@Enthusiast 请问您是如何将匹配结果追加回DF的呢? c = [process.extract(x, df1['Name'], limit=5) for x in df2['Name']]我的代码返回了以下列表,我需要将其追加回df1中。 [[(' Hong Kong', 100, 0)]] - Maneet Giri
@StatguyUser 你好。你是如何使用这个来在数据框中索引匹配项的? - Aquiles Páez
@AquilesPáez,将其转换为列表并作为新列添加。尽管这将违背我们使用生成器的目的。还没有检查是否可以直接添加为列而不进行转换。 - StatguyUser
生成器似乎更快,因为它通过不等待循环的完整执行来帮助执行更具响应性。但是,如果您确实需要生成所有匹配项,从长远来看它是否有帮助?更多细节请参见:https://dev59.com/7I3da4cB1Zd3GeqP26Zm#31766906 - hafiz031

0

你可以使用Python的多线程包来加速处理。Pandas默认情况下不支持多核。


2
“多线程”在CPython上至少不能与多个核心一起工作。 - juanpa.arrivillaga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接