Объединение значений из похожих строк в файл CSV - PullRequest
0 голосов
/ 06 июля 2019

Итак, у меня есть 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»). Каков наилучший способ обнаружения этих похожих имен строк (скажем, с помощью Fuzzywuzzy) при циклическом просмотре файла CSV и консолидации экземпляра транзакции и сумм?

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

Прочитайте CSV-файл в пандах. Затем добавьте новый столбец для fuzzywuzzy процента совпадения.

Создайте пороговое значение для того, какой процент будет считаться той же строкой, а затем выполните вычисление, отфильтровав метод isin() и добавив значения столбцов для суммы транзакции.

Зацикливайте это на всей вашей DataFrame, и вы получите нужный результат.

0 голосов
/ 06 июля 2019
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
...