Создайте несколько фреймов данных быстрее. Цикл слишком медленный - PullRequest
1 голос
/ 09 октября 2019

Я пытаюсь создать несколько фреймов данных, используя код ниже. Моя проблема заключается в следующем, у меня есть список имен (lista_names), один фрейм данных (df1), и я хотел бы создать один фрейм данных для каждого имени в моем списке. В каждом из этих новых фреймов данных одним из столбцов будет расстояние Левенштейна между одним именем в моем списке и всеми именами в фрейме данных df1. Таким образом, в итоге у меня будет n новых фреймов данных, где n - количество имен в моем списке. Вот мой код:

lev = pd.DataFrame({'Levenshtein':0,'n_ordem':0,'nome_ea':'a','nome_censo':'a'}, index = [1])

for i in range(0,len(lista_names)):
    for k in range(0,len(df1)):
        if isinstance(df1['nome_comp'][k],str):
            if Levenshtein.distance(lista_names[i], df1['nome_comp'][k])<=21:
                lev = lev.append({'Levenshtein':Levenshtein.distance(lista_names[i], df1['nome_comp'][k]),
                'n_ordem': df1['n_ordem'][k], 'nome_ea': lista_names[i],'nome_censo': df1['nome_comp'][k]}, 
                                 ignore_index = True)

lev.drop(0, axis=0, inplace = True)

lev.to_csv('levenshtein.csv')

Хотя это решение работает, оно слишком медленное и не может создать файл csv даже после 2 дней работы на моем ПК. Есть ли способ сделать это быстрее?

Edit1: n = 291

1 Ответ

2 голосов
/ 09 октября 2019

Проблема в строке

lev = lev.append({'Levenshtein':Levenshtein.distance(lista_names[i], df1['nome_comp'][k])

внутри цикла.

Pandas DataFrames не предназначены для последовательной вставки и при этом очень неэффективны.

Вместо этого создайте список DataFrames levs и добавьте к нему DataFrame в цикле.

levs.append(pd.DataFrame(lev = lev.append({'Levenshtein':Levenshtein.distance(lista_names[i], df1['nome_comp'][k]),
            'n_ordem': df1['n_ordem'][k], 'nome_ea': lista_names[i],'nome_censo': df1['nome_comp'][k]})

Когда цикл завершится, позвоните pd.concat(levs). YMMV, но из аналогичных случаев, которые у меня были, он должен быть в 10-200 раз быстрее, чем ваш текущий код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...