优化数据框的列的遍历
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])
.
我想使用 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])
.