优化数据框的列的遍历

Optimize the traversal of a column of a dataframe

我想使用 fuzzywuzzy 检查数据框列中的模糊重复项。 在这种情况下,我必须使用两个嵌套的 for 循环逐行迭代。

for i in df['col']:
    for j in df['col']:
       ratio = fuzz.ratio(i, j)
       if ratio > 90:
           print("row duplicates")

除了我的数据框包含600 000 rows,这段代码的复杂度为0(n²)。 有更简单的方法吗?

对于您的用例,我建议使用 RapidFuzz(我是作者)。特别是函数 process.cdist 应该允许您非常有效地实现它:

import numpy as np
from rapidfuzz import fuzz, process

process.cdist(df['col'], df['col'],
    scorer=fuzz.ratio, dtype=np.uint8, score_cutoff=90, workers=-1)

请注意,这会创建一个大小为 len(df['col']) * len(df['col']) 的矩阵,这在处理 600.000 个元素(大约 335 GB)时会很大。为了减少内存使用,您可以在多个较小的步骤中比较字符串:

process.cdist(df['col'][0:10000], df['col'][0:10000],
    scorer=fuzz.ratio, dtype=np.uint8, score_cutoff=90, workers=-1)

请注意,由于您将行与自身进行比较,因此可以跳过此矩阵的某些部分,因为 fuzz.ratio(df['col'][1], df['col'][0]) == fuzz.ratio(df['col'][0], df['col'][1]).