самый быстрый способ выполнить нечеткое сопоставление двух строк в кадре данных pandas

У меня есть два фрейма данных со списком имен

df1[name]   -> number of rows 3000

df2[name]   -> number of rows 64000

Я использую fuzzy wuzzy, чтобы получить наилучшее соответствие для записей df1 из df2, используя следующий код:

from fuzzywuzzy import fuzz
from fuzzywuzzy import process

matches = [process.extract(x, df1, limit=1) for x in df2]

Но это занимает целую вечность, чтобы закончить. Есть ли более быстрый способ выполнить нечеткое сопоставление строк в пандах?


person kunal deep    schedule 16.08.2017    source источник
comment
Имена уникальны? Если нет, вы можете ускорить его с помощью кэширования. Кроме того, вы установили модуль python-levenshtein? Это значительно ускоряет процесс (результаты могут немного отличаться).   -  person Paulo Almeida    schedule 16.08.2017
comment
Привет, @PauloAlmeida, да, я уже добавил модуль python-levenshtein. Имена уникальны.   -  person kunal deep    schedule 16.08.2017


Ответы (2)


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

matches = (process.extract(x, df1, limit=1) for x in df2)

Редактировать: еще одно предложение, мы можем распараллелить операцию с библиотекой multiprocessing.

person StatguyUser    schedule 16.08.2017
comment
Рад, что смог быть полезен!! - person StatguyUser; 21.08.2017
comment
@Enthusiast Не могли бы вы рассказать мне, как вы вернули совпадение в DF обратно. c = [process.extract(x, df1['Name'], limit=5) for x in df2['Name']] Мой код извлекает список, как показано ниже. Мне нужно добавить то же самое в df1. [[('Гонконг', 100, 0)]] - person Maneet Giri; 05.11.2018
comment
@StatguyUser привет. Как вы использовали это для индексации совпадений в кадре данных? - person Aquiles Páez; 14.11.2020
comment
@AquilesPáez, преобразуйте его в список и добавьте в качестве нового столбца. Хотя это лишает цели, почему мы должны были использовать генератор. Не проверял, можем ли мы напрямую добавить столбец без преобразования. - person StatguyUser; 14.11.2020
comment
Генератор кажется быстрее только потому, что он помогает выполнению быть более отзывчивым, не дожидаясь полного выполнения цикла. Но если вам нужно сгенерировать все совпадения, будет ли это полезно в долгосрочной перспективе? Больше поворотов здесь: stackoverflow.com/a/31766906/6907424 - person hafiz031; 28.07.2021

Вы можете использовать пакет многопоточности Python, чтобы ускорить его. Pandas по умолчанию не использует многоядерность.

person user3846369    schedule 16.08.2017
comment
multithreading не будет работать с несколькими ядрами, по крайней мере, на CPython. - person juanpa.arrivillaga; 16.08.2017