gpt4 book ai didi

python - 减少大量数据帧的 pandas concat 的内存使用量

转载 作者:行者123 更新时间:2023-12-01 07:45:04 58 4
gpt4 key购买 nike

我有一堆(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),但对于速度来说却很糟糕。

然后我想出了以下内容。我用双端队列替换列表并逐段进行串联。它节省了内存(最近运行时为 4.1GB,最近运行为 5.4GB),并且速度降低了可控(在 5-6 分钟的总长度脚本中添加了 <30 秒),但我似乎无法弄清楚为什么 这节省内存吗?

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 倍的内存。功能正确。是什么让这项工作成功?虽然我上面引用的速度提升和节省内存的数字是特定于一次运行的,但在多次运行中总体趋势是相同的。

除了尝试找出上述方法为何有效之外,还可以接受其他方法建议。

最佳答案

只需提前创建全尺寸的 DataFrame:

df = pd.DataFrame(index=pd.RangeIndex(0, N), columns=[...])

然后分段写入:

col = 0
for path in paths:
part = pd.read_csv(path)
df.iloc[:,col:col+part.shape[1]] = part
col += part.shape[1]

关于python - 减少大量数据帧的 pandas concat 的内存使用量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56502377/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com