Python: сохранение только максимального результата externalloop при сравнении сходства строк в двух списках - PullRequest
1 голос
/ 02 июня 2019

У меня две таблицы с неравным количеством столбцов, но с одинаковым порядком, давайте назовем старую и новую.старый имеет больше столбцов, чем новый, чем новый.

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

Пример:

old=['Item number','Item name', 'Item status', 'Stock volume EUR','Stock volume USD', 'Location']

new=['Item_number','Item', 'Item_status','Stock volume EUR', 'Location']

На самом деле, если в новом списке есть список из 50 столбцов и меньше на 4 столбца.

В настоящее время я создал список заголовков столбцов.и применил расстояние Левенштейна, разделенное на длину строки, через вложенную петлю, чтобы найти наиболее похожие строки.

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

distance=[jellyfish.levenshtein_distance(x,y)/len(x)for x in a for y in b 

Я хочу использовать новые заголовки столбцов в старом списке и удалить столбцы, которые не совпадают в новой таблице

1 Ответ

1 голос
/ 02 июня 2019

Я здесь, чтобы предложить совершенно другой подход. Поскольку вы используете расстояние Левенштейна, я предлагаю использовать пакет fuzzywuzzy, который имеет более быструю реализацию, а также некоторые готовые методы, которые идеально подойдут для вашей цели.

from fuzzywuzzy import process
from fuzzywuzzy.fuzz import ratio
old=['Item number','Item name', 'Item status', 'Stock volume EUR',
     'Stock volume USD', 'Location']

new=['Item_number','Item', 'Item_status','Stock volume EUR', 'Location']

mapper = [(new_hdr,process.extractOne(new_hdr,old,scorer=ratio)[0]) for new_hdr in new]
df = df[[i[1] for i in mapper]]
df.columns = [i[0] for i in mapper]

Решение гораздо более точное с точки зрения кодирования и читабельности. Однако, в зависимости от точных строк, метод extractOne может не определить правильную карту для всех случаев. Проверьте, происходит это или нет. Проверьте, происходят ли такие случаи или нет. Соответственно, нам, возможно, придется настроить аргумент scorer в extractOne

...