Скопируйте приблизительное соответствие строки из excel в другой файл excel, используя python

Привет, я хотел бы спросить, как скопировать часть строки из одного файла Excel в другой файл Excel. Используя метод нечеткого сопоставления Python или ЛЮБОЙ другой возможный способ, можно надеяться, что вся строка в соответствии с именем будет сопоставлена ​​и скопирована в новый файл Excel.

Вот входные данные из первого файла Excel, всего 13 строк и 6 столбцов, как показано ниже:

-----------------------------------------------------|-----|-----|-----|-----|-----|
| name                                               | no1 | no2 | no3 | no4 | no5 |
-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Club___Long to Club___Short___Water           | abc | abc | abc | abc | abc |
-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Club___Long to Short___Water                  | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Club___Long___Land to Short___Water           | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Kinabalu___BB to Penang___AA                  | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Kinabalu___SD to Penang___SD                  | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Hill___Town to Unknown___Island___Ice         | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Hill___Town to Unknown___Island___Ice         | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Hill___Town to Unknown___Island___Ice         | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Front___House___AA(N) to Back___Garden(N)     | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Front___House___AA___(N) to Back___Garden     | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Left___House___Hostel(w) to NothingNow___(w)  | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Laksama to Kota_Dun                           | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|

Вводя первую строку, я хотел бы, чтобы python распознал приблизительное похожее имя строки, скопировал всю строку и вставил ее в новый файл Excel. Сравнивая сходство слов вместо алфавита, например, сколько слов одинаково, если оно больше или равно определенному количеству (скажем, 50%), оно будет передано для копирования.

Например, сравнивая строку 2 и строку 3, from Club___Long to Club___Short___Water очень похож на from Club___Long to Short___Water, from Club___Long to Club___Short___Water содержит 7 слов, а from Club___Long to Short___Water содержит 6 слов. Из 7 слов from Club___Long to Club___Short___Water есть 6 слов, похожих на from Club___Long to Short___Water. Следовательно, 6 / 7 * 100% = 85.71%, что составляет более 50%, python сочтет его совпавшим и скопирует.

Например, строки со 2 по 4 примерно одинаковы, поэтому python сопоставит их и распознает почти одинаково, скопирует только всю строку 2 во всю строку 4 в новый файл Excel и назовет его «new_file_1.xlsx». Желаемый результат, как показано ниже:

-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Club___Long to Club___Short___Water           | abc | abc | abc | abc | abc |
-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Club___Long to Short___Water                  | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Club___Long___Land to Short___Water           | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|

То же самое касается строки 5 и строки 6, и назовите ее как «new_file_2.xlsx», желаемый результат, как показано ниже:

-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Kinabalu___BB to Penang___AA                  | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Kinabalu___SD to Penang___SD                  | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|

То же самое происходит со строкой 7 до строки 9, и назовите ее как «new_file_3.xlsx», желаемый результат, как показано ниже:

-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Hill___Town to Unknown___Island___Ice         | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Hill___Town to Unknown___Island___Ice         | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Hill___Town to Unknown___Island___Ice         | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|

То же самое относится к строке 10 до строки 11 и назовите ее как «new_file_4.xlsx», желаемый результат, как показано ниже:

-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Front___House___AA(N) to Back___Garden(N)     | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|
| from Front___House___AA___(N) to Back___Garden     | def | def | def | def | def |  
-----------------------------------------------------|-----|-----|-----|-----|-----|

Что касается строки 12 и строки 13, они обе не похожи на другие строки, поэтому не нужно копировать, просто оставьте их.

Очень признателен, если кто-нибудь может мне помочь, спасибо!


person Edison Toh    schedule 18.05.2020    source источник


Ответы (1)


Я создаю функцию для замены дубликатов. это база на нечеткой логике. Я просто заменяю каждое имя наиболее подходящим из всех других имен с учетом отсечки. Затем я создаю новый столбец, в котором храню эти уникальные имена.

import difflib
import re

def similarity_replace(series):

    reverse_map = {}
    diz_map = {}
    for i,s in series.iteritems():

        clean_s = re.sub(r'(from)|(to)', '', s.lower())
        clean_s = re.sub(r'[^a-z]', '', clean_s)

        diz_map[s] = clean_s
        reverse_map[clean_s] = s

    best_match = {}
    uni = list(set(diz_map.values()))
    for w in uni:
        best_match[w] = sorted(difflib.get_close_matches(w, uni, n=3, cutoff=0.6))[0]

    return series.map(diz_map).map(best_match).map(reverse_map)

df = pd.DataFrame({'name':['from Club___Long to Club___Short___Water','from Club___Long to Short___Water',
                           'from Club___Long___Land to Short___Water','from Kinabalu___BB to Penang___AA',
                           'from Kinabalu___SD to Penang___SD','from Hill___Town to Unknown___Island___Ice',
                           'from Hill___Town to Unknown___Island___Ice','from Hill___Town to Unknown___Island___Ice',
                           'from Front___House___AA(N) to Back___Garden(N)','from Front___House___AA___(N) to Back___Garden',
                           'from Left___House___Hostel(w) to NothingNow___(w)','from Laksama to Kota_Dun'],
                  'no1':['adb','adb','adb','adb','adb','adb','adb','adb','adb','adb','adb','adb']})

df['group_name'] = similarity_replace(df.name)
df

введите здесь описание изображения

мы можем использовать этот столбец, чтобы сгруппировать все экземпляры, которые похожи и на что-то

for i,group in df.groupby('group_name'):

    ### do something ###
    print(group[['name','no1']])
person Marco Cerliani    schedule 19.05.2020