我有一堆(15,000多个)小数据框,我需要在pandas中逐列串联成一个很大的(100,000x1000)数据框。我有两个(很明显的)担心,速度和内存的使用。
以下是我在Stack Overflow上看到的一个被高度认可的方法。
dfList = [df1, df2, ..., df15000] #made by appending in a for loop
df_out = pd.concat(dfList, axis=1)
这对速度来说是很好的。这是简单的代码,很容易理解。然而,它使用了相当大的内存。我的理解是,Pandas的concat
函数是通过建立一个新的大数据框架,然后将所有的信息复制过来,本质上是将程序所消耗的内存翻倍。
我如何避免这种大的内存开销,同时又能将速度降低到最小?
我试着在一个for循环中把列一个一个地添加到第一个df中。对内存来说很好(1+1/15,000),对速度来说很糟糕。
Then I came up with the following. I replace the list with a deque and do concatenation peicewise. It saves memory (4.1GB vs 5.4GB on most recent run), at a manageable speed decrease (<30seconds added here on a 5-6min total length script), but I can't seem to figure out why这样做能节省内存吗?
dfDq = collections.deque()
#add all 15,000 dfs to deque
while(len(dfDq)>2):
dfDq.appendleft(pd.concat([dfDq.pop(), dfDq.pop(), dfDq.pop()], axis=1))
if(len(dfDq)==2): df_out = pd.concat([dfDq.pop(), dfDq.pop()], axis=1)
else: df_out=dfDq.pop()
如果我对pd.concat()
函数的理解是正确的,这种逐级连接的最后一步应该仍然使用2倍的内存。是什么让这一方法奏效?虽然我上面引用的速度提升和内存节省的数字是针对那一次运行的,但在多次运行中,总体趋势是一样的。
除了试图弄清上述方法的原因外,也愿意接受其他方法的建议。