python - 更快地创建多个数据帧。 for循环太慢

标签 python pandas performance dataframe

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

相关文章:

c - 并行效率下降不一致

python - stompath - 是否可以将用户帐户从一个目录迁移到另一个目录

python - 比较数据帧并输出匹配计数

python - 改进获取时间和该函数的性能

c++ - 手动 SIMD 代码的可负担性

Python:根据另一列和行的条件函数创建新列

python - Python itertools.product() 实现的解释?

python - 如何使用 lambda 对元组进行排序

python - 必须释放连接时使用 try/except/finally 的 pythonic 方式是什么?

python - 如何根据id将相似的名字合并为一个名字,并根据代码进行加减