更快地创建多个数据框。 For循环太慢

时间:2019-10-09 17:28:41

标签: python pandas performance dataframe

我正在尝试使用以下代码创建多个数据框。我的问题如下:我有一个名称列表(lista_names),一个数据框(df1),并且我想为列表中的每个名称创建一个数据框。在每个这些新数据框中,列之一将是我列表中的一个名称与数据框df1中的 all 名称之间的Levenshtein距离。因此,最后我将有 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')

尽管此解决方案有效,但它速度太慢,即使在PC上运行2天后也无法生成csv文件。有没有办法使其更快?

Edit1:n = 291

1 个答案:

答案 0 :(得分:2)

问题出在线路上

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

在循环内。

Pandas DataFrame不是为顺序插入而设计的,因此效率很低。

相反,创建一个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倍。