python - Pandas unstack()和pivot() : MemoryError

标签 python python-3.x pandas out-of-memory

问题描述

我想取消堆叠或旋转 DataFrame,但它会引发 numpy 异常 MemoryError: Unable to allocate 1.72 GiB for an array with shape (1844040704,) and data type bool。我已经尝试过使用具有数字索引 -> df.pivot() 的 DataFrame 和 Multiindex -> df.unstack() ]。两者都显示相同的异常,我不知道解决方法。我不觉得我有一个包含 175199 行的特别大的数据集。我之前曾在超过 5mio 行的 DataFrame 上使用过 unstack。 为了完整的分析,df 甚至会变大 2 倍!

我尝试使用 df_unstacked = df.unstack(level=0)

取消堆叠

其他信息

在进行透视/取消堆栈之前,我必须使用df['row_num'] = np.arange(len(df))添加唯一索引,因为数据集包含(想要的)重复索引条目。这是因为实行夏令时,10 月的一天有 25 个小时。第二个小时是重复的。

我使用 python 3.7 在 vi​​rtualenv 中使用 Jupyterlab。

软件包版本:

  • Pandas ==1.1.2
  • numpy==1.19.2
  • jupyterlab==2.2.8

示例数据

                                    value
target_frame        row_num year         
2017-01-01 01:00:00 0       2016  10,3706
2017-01-01 01:15:00 1       2016  27,2456
2017-01-01 01:30:00 2       2016  20,4022
2017-01-01 01:45:00 3       2016  14,4911
2017-01-01 02:00:00 4       2016  14,2611
...                                   ...
2017-12-31 23:45:00 175195  2020  30,7177
2017-01-01 00:00:00 175196  2020  21,4708
2017-01-01 00:15:00 175197  2020  44,9192
2017-01-01 00:30:00 175198  2020  37,8560
2017-01-01 00:45:00 175199  2020  30,9901

[175200 rows x 1 columns]

期望的结果

索引将包含重复项。根据记录,我不在乎它是索引还是常规列。

                     value
year                 2016     2017  ...  2020
target_frame                  
2017-01-01 01:00:00  10,3706  11    ...  32
2017-01-01 01:15:00  27,2456  12    ...  32
2017-01-01 01:30:00  20,4022  13    ...  541
2017-01-01 01:45:00  14,4911  51    ...  123
2017-01-01 02:00:00  14,2611  56    ...  12
...                                   ...
2017-12-31 23:45:00  30,7177  12    ...  12
2017-01-01 00:00:00  21,4708  21    ...  12
2017-01-01 00:15:00  44,9192  21    ...  13
2017-01-01 00:30:00  37,8560  21    ...  11
2017-01-01 00:45:00  30,9901  12    ...  10

[35040 rows x 5 columns]

最佳答案

我将尽力帮助您解决内存不足的问题以及处理该问题的方法。

由于您的数据已经有近 20 亿条记录,并且错误与内存有关,因此我将重点关注这一点,而不考虑转换本身。

如果您使用的是 df、df_pivoted、df_unstacked 等。每次转换时,您都会创建一个新变量,并增加内存消耗。所以在这个过程中清除内存很重要。即使您的数据似乎不够大,不足以消耗您的所有内存。

解决此问题的一种方法是处理“ block ”并将每个转换步骤保存到文件中以清除内存。

因此第一步是使用简单的“dataframe.to_csv ()”保存文件。

第二步是使用适合内存的部分数据进行转换。

为此,pandas.read_csv () 函数中有一个名为“chuncksize”的参数,它将您的导入对象转换为迭代 TextFileReader。

这样,如果要访问数据信息,就需要对其进行迭代。

iterator = pandas.read_csv('file.csv', chuncksize=32)
iterator.shape # will raise an error.

AttributeError: 'TextFileReader' object has no attribute 'shape'

正确的做法:

for chunck in iterator:
    print (chunck.shape)

输出:

(32, ncols)

这样,为了解决您的问题,您可以使用 block 并在需要数据时使用连接函数进行分析。

关于python - Pandas unstack()和pivot() : MemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64063423/

相关文章:

Python Sklearn.Model_Selection 给出无法导入梳子的错误

python - JSON 到 Python 数据框

python - Pandas/Matplotlib 直方图问题 - x 轴刻度在子图和额外不需要的图表空间中消失。试过 tight_layout 和 subplots_adjust

python - python中有什么方法可以从数据框中搜索模式并提取其相应的值吗?

python - 如何标准化混淆矩阵?

python - 导入后的 For 循环在 Python 单行中不起作用

python - 是否有可用于针对多个 Python 版本测试 Python 模块的框架?

python - 带有 GeoAlchemy 示例代码的 Flask

python-3.x - 在 FreeBSD 上使用 pip3 安装 matplotlib 失败

Python将字符串添加到列表循环中