дедупликация строк (отдельных листов / нескольких) на основе нечеткой логики - PullRequest
0 голосов
/ 04 июня 2019

Я - нубский кодер, но хочу изучать и понимать методы. Не могли бы вы, ребята, быть добрыми, чтобы указать мне правильное направление? У меня есть набор данных, который содержит 1. имя - написание меняется 2. адрес - написание меняется 3. город - постоянный 4. состояние - постоянное 5. пин-код - константа в 85% данных

У меня 12 файлов, которые были объединены, и теперь он содержит 500 000 строк с дублирующимися значениями. Я хочу отсортировать дубликаты и создать уникальный список.

Я попробовал fuzzywuzzy и попытался решить его двумя способами 1. держать CSV отдельно и сравнивать друг с другом 2. Объедините все CSV и используйте нечеткую логику в адресной колонке

1-й подход (слишком медленно убивает ноутбук Юпитер):

    df2 =pd.read_csv('apollo-munich-network-hospital.csv', delimiter = '|')
    compare = pd.MultiIndex.from_product([df1['address'],
                                          df2['address']]).to_series()
    def metrics(tup):
        return pd.Series([fuzz.ratio(*tup),
                          fuzz.token_sort_ratio(*tup)],
                         ['ratio', 'token'])
    test= compare.apply(metrics)

2nd approach(too slow that kernel interupted)

data = pd.read_csv('txt_files/hospital_to_clean_duplicates.csv',delimiter= '|')
with open('data_out.csv', 'w') as f1:
    writer = csv.writer(f1, delimiter='|', lineterminator='\n', )
    def remove_duplicates_inplace(data, groupby=[], similarity_field='', similar_level=85):
        def check_simi(d):
            dupl_indexes = []
            for i in range(len(d.values) - 1):
                for j in range(i + 1, len(d.values)):
                    if fuzz.token_sort_ratio(d.values[i], d.values[j]) >= similar_level:
                        dupl_indexes.append(d.index[j])

            return dupl_indexes

        indexes = data.groupby(groupby)[similarity_field].apply(check_simi)

        for index_list in indexes:
            data.drop(index_list, inplace=True)

    remove_duplicates_inplace(data, groupby=['name','address','pincode','city','state'], similarity_field='address')```

expected output
1. name
2. address (can i choose the longest string as parent, compare with others)
3. city
4. state
5. pincode

separate sheets with (if possible to evulate)
1. name
2. city
3. state
4. pincode
5. address1 -original 
6. matched address
7. match percentage
...