我正在尝试使用下面的代码创建多个数据框。我的问题如下,我有一个名称列表(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')
虽然这个解决方案有效,但它太慢了,即使在我的电脑上运行 2 天后也无法构建 csv 文件。有没有办法让它更快?
编辑1:n=291
最佳答案
问题出在线路上
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 倍。
关于python - 更快地创建多个数据帧。 for循环太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58309356/