在循环中连接数据帧非常慢

Posted

技术标签:

【中文标题】在循环中连接数据帧非常慢【英文标题】:Concatenating dataframes in a loop very slow 【发布时间】:2020-12-31 10:04:43 【问题描述】:

我正在通过在 for 循环中连接来构建一个“主”数据帧

df = pd.concat([df, pd.DataFrame(listdf)], axis = 1)

listdf 是在连接到数据帧之前进行预处理的临时列表。 我面临的问题是随着循环迭代次数的增加,构建数据帧的过程变得越来越慢。

我在这里研究过,根据这个建议,建立一个列表然后最终将它连接到一个数据帧中要快得多 Why does concatenation of DataFrames get exponentially slower?

但是这种方法不起作用

interimdf.append(listdf)
df = pd.concat(interimdf)

我收到了这个错误

TypeError: cannot concatenate object of type '<class 'list'>'; only Series and DataFrame objs are valid

我该如何解决这个问题。还有一种替代方法可以加快循环创建一个大数据帧的过程

【问题讨论】:

listdf的类型是什么? type(listdf) 为此,listdf 必须使用 pd.Series 或 pd.DataFrame。 属于列表类型 我不确定这是否适合您,但请在此处查看您的帖子。试试这个interimdf.append(pd.DataFrame(listdf)) 效果非常好。现在火的很快。早些时候,我需要 3-4 小时来运行该循环,现在它在不到一秒的时间内完成。谢谢 太棒了。我很高兴这对你有用。是的,我会记住“二次复制”问题。我提交了解决方案。 【参考方案1】:

您需要将数据框附加到列表中,而不是将数据附加到列表中。

试试:

interimdf.append(pd.DataFrame(listdf))

然后在你的循环之外,

pd.concat(interimdf) 

【讨论】:

以上是关于在循环中连接数据帧非常慢的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个交叉连接在 Linq 中这么慢?

求助:mysql连接数多的时候,速度出奇慢

在熊猫中连接/附加许多数据帧

数据库连接太慢问题(3层for)

循环转置和连接数据帧列表

使用 data.table 存储为列表元素的多个数据帧的完全外连接