首页 > 解决方案 > 使用模糊 wuzzy 和 pandas 对 SQL 进行模糊匹配

问题描述

我在 SQL 中有下表,并希望使用 Fuzzy Wuzzy 来比较表中的所有记录以查找任何潜在的重复项,在这种情况下,第 1 行是第 2 行的重复项(反之亦然)。有人可以解释我如何使用 Fuzzy Wuzzy 和 pandas 向该表添加两个额外的列(最高分和记录行数)吗?谢谢。

输入:

Vendor  Doc Date    Invoice Date       Invoice Ref Num  Invoice Amount
ABC    5/12/2019    5/10/2019          ABCDE56.         56
ABC    5/13/2019    5/10/2019          ABCDE56          56
TIM    4/15/2019    4/10/2019          RTET5SDF         100

期望的输出:

Vendor  Doc Date    Invoice Date    Invoice Ref Num Invoice Amount  Highest Score   Record Line Num
ABC     5/12/2019   5/10/2019       ABCDE56.        56              96              2
ABC     5/13/2019   5/10/2019       ABCDE56         56              96              1
TIM     4/15/2019   4/10/2019       RTET5SDF        100             0               N/A

标签: pythonpandasfuzzywuzzy

解决方案


由于您正在寻找重复项,因此您应该首先使用供应商名称过滤您的数据框。这是为了确保它与其他供应商的发票不匹配并减少处理时间。但是,由于您没有提及它,您可以跳过它。

根据发票参考的长度确定重复的阈值。例如,如果平均值为 5 个字符,则将阈值设为 80%。然后,使用fuzzywuzzy 获得最佳匹配。

from fuzzywuzzy import fuzz, process

# Assuming no NaNs in invoices references
inv_list = df['Invoice Ref'].to_list()
for i, inv in enumerate(inv_list)
     result = process.extractOne(inv, inv_list, scorer=fuzz.token_sort_ratio)
     if result[1] >= your_threshould:
          df.loc[i, 'Highest Score'] = result[1]
          df.loc[i, 'Record Line Num'] = inv_list.index(result[0])

推荐阅读