python - 使用模糊 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
解决方案
由于您正在寻找重复项,因此您应该首先使用供应商名称过滤您的数据框。这是为了确保它与其他供应商的发票不匹配并减少处理时间。但是,由于您没有提及它,您可以跳过它。
根据发票参考的长度确定重复的阈值。例如,如果平均值为 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])
推荐阅读
- reactjs - 我如何将 react-habitat 与 React 的 Context API 一起使用
- python - pyspark 将 twitter json 流式传输到 DF
- javascript - 为什么 window.open() 在循环中通过 setTimeout() 调用时会被静默忽略?
- elasticsearch - 使用javascript的elasticsearch中的ReferenceError
- ios - ping www.apple.com 端口
- php - 1分钟后自动增加一个值
- swift - 在 swift 4.1 中将字符串转换为双精度
- c++ - 导入的库函数可以在内存中移动吗
- pandas - 如何计算列中更改了多少次
- java - 在 LeanFT 中最大化浏览器窗口