python - 在 CSV 文件中组合来自类似字符串的值
问题描述
所以我有一个充满交易的 CSV 文件,其中供应商名称在一列,交易金额在另一列。目标是根据交易总数找到顶级供应商。那部分非常简单,我有这样的代码:
with open('Transactions.csv') as Vendor_Data:
file_reader = csv.reader(Vendor_Data, delimiter=',')
vendor_dict = {}
next(file_reader)
for row in file_reader:
if row[3] not in vendor_dict:
vendor_dict[row[3]] = [0, 0]
vendor_dict[row[3]][1] += round(float(row[1]), 2)
else:
vendor_dict[row[3]][0] += 1
vendor_dict[row[3]][1] += round(float(row[1]), 2)
问题是,在许多条目中,同一供应商的拼写略有不同(“Delta Airlines”与“Delta Air”)。在遍历 CSV 文件并合并交易实例和金额时,检测这些相似字符串名称(例如,使用 Fuzzywuzzy)的最佳方法是什么?
解决方案
import csv
from fuzzywuzzy import fuzz
with open('Transactions.csv') as Vendor_Data:
file_reader = csv.reader(Vendor_Data, delimiter=',')
vendor_dict = {}
next(file_reader) # skipping a header?
for row in file_reader:
# we can't use the dictionary directly (e.g. "key in vendor_dict")
# because we want to do a similarity search.
csv_name = row[3]
for vendor_name, vendor_values in vendor_dict.iteritems():
# this is *a* way to do it. You may want to use different scores
# or even a different comparison
if fuzz.token_set_ratio(csv_name, vendor_name) > 80:
vendor_values[0] += 1
vendor_values[1] += round(float(row[1]), 2)
break
else:
# we didn't find anything similar enough, so create an entry
vendor_values = [0, 0]
vendor_values[1] += round(float(row[1]), 2)
vendor_dict[csv_name] = vendor_values
推荐阅读
- c# - .Net Core 2.1 + MassTransit - 无法访问已处置的对象。对象名称:'IServiceProvider'
- php - PHP MySQLi 检查用户是否投票,如果是,其他用户也可以投票
- amazon-web-services - Appsync 响应映射模板 json 键名更改
- python - 如何在 Python 中使用具有复杂类型的 C 函数?
- sql - 在 SQL Server 中逐行比较两个不同表中的两个文本列
- c# - 正则表达式模式匹配 C#
- javascript - javascript - 在按钮单击和返回值时重复多级下拉菜单
- c# - 错误 CS0103:当前上下文 (CS0103) (testingProgram) 中不存在名称“TimeSpan”?
- javascript - 提交时在文本框中附加数字
- vim - 在vim中的命令后进入两个标签之间的插入模式