我正在尝试使用以下代码创建多个数据框。我的问题如下:我有一个名称列表(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
答案 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倍。