在 pandas 中加入数据帧时的内存问题(时间索引)

Posted

技术标签:

【中文标题】在 pandas 中加入数据帧时的内存问题(时间索引)【英文标题】:Memory issues when joining dataframes in pandas (time indexed) 【发布时间】:2019-08-26 13:02:43 【问题描述】:

我正在尝试在 pandas 中加入(或合并)两个按时间索引的数据帧,但我的代码将表累积在内存中。

每个文件只有 1 MB,几个文件后,计算机内存不足。

如何在原地做这个操作?

用于连接表(左、右、内、外...)的方法不会改变性能问题。

import pandas as pd
from glob import glob  

filenames = glob('*.txt')

filename = filenames[0]
varname =  filename[:-11] # removes three last char extension from string

print('Sampling', filename)
data = pd.read_csv(filename, sep=';', skiprows=3, names=['time', varname ],
               index_col=0)


for filename in filenames[1:]:

    print('Sampling', filename)

    varname =  filename[:-11] # removes three last char extension from string

    data_new = pd.read_csv(filename, sep=';', skiprows=3, names=['time', varname ],
               index_col=0)


    #data = pd.DataFrame.join(data, data_new, how='outer', on='time')
    data = pd.DataFrame.merge(data_new, data, how='outer', on='time', copy=False)

这些是运行三个文件的代码后的 data.head() 和 data.tail()。

                    var1    var2    var3    var4    var5
time                    
01/01/2016 07:00:00 13.3781 6.95406 NaN 87.6588 71.5696
01/01/2016 08:00:00 13.2312 6.89561 NaN 87.6221 71.6038
01/01/2016 09:00:00 13.2774 6.90632 NaN 87.2595 71.4383
01/01/2016 10:00:00 13.6152 7.02360 NaN 87.2028 71.4482
01/01/2016 11:00:00 13.5584 7.00147 NaN 87.3733 71.3335

...

                    var1    var2    var3    var4    var5
time                    
01/01/2019 02:00:00 15.8096 28.2316 NaN 87.5106 68.6665
01/01/2019 03:00:00 15.8352 28.1616 NaN 87.7226 69.0639
01/01/2019 04:00:00 15.6879 27.6819 NaN 87.1135 68.6873
01/01/2019 05:00:00 15.6558 27.7961 NaN 87.4658 69.1395
01/01/2019 06:00:00 15.7383 28.1330 NaN 87.5775 68.8240

【问题讨论】:

了解输入数据会很有帮助。在您的 MCVE 中,您可以生成示例文件。尝试将 CSV 加载拉出执行合并的循环。它将帮助您了解导致问题的部分。在对它们进行操作之前加载数十个数据帧并将它们保存在内存中并没有本质上的错误。 【参考方案1】:

如果数据帧共享相同的索引,pd.concat 将毫无问题地执行操作。

data = pd.concat([data, data_new], axis=1)

【讨论】:

以上是关于在 pandas 中加入数据帧时的内存问题(时间索引)的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 中加入两个大型数据集的最佳方法

在单个多核机器上索引大型 dask 数据帧时的内存使用情况

在 Pandas 中加入一个数据集和 OneHotEncoder 的结果

如何在 Pandas 中加入 2 列词嵌入

如何在 Python 中的一个常规 Pandas DataFrame 中加入许多零散的时间序列

当输入是 pandas 数据帧时,为啥 Tensorflow 2 会发出警告(但仍然有效)?