Python Pandas unstack()和pivot():MemoryError 问题描述

Python Pandas unstack()和pivot():MemoryError 问题描述,python,python-3.x,pandas,out-of-memory,Python,Python 3.x,Pandas,Out Of Memory,我想取消数据帧的堆栈或透视,但它会引发numpy异常MemoryError:无法为具有形状(1844040704,)和数据类型bool的数组分配1.72 GiB。我已经用一个带有数字索引的数据帧->df.pivot()和一个带有多索引的数据帧->df.unstack()]尝试了这一点。两者都有相同的例外,我不知道如何解决。我不觉得我有一个175199行的超大数据集。我以前在超过5mio行的数据帧上使用过unstack对于完整的分析,df甚至会变大2倍 我尝试使用df\u unstacked=df

我想取消数据帧的堆栈或透视,但它会引发numpy异常
MemoryError:无法为具有形状(1844040704,)和数据类型bool的数组分配1.72 GiB。我已经用一个带有数字索引的数据帧
->df.pivot()
和一个带有多索引的数据帧
->df.unstack()
]尝试了这一点。两者都有相同的例外,我不知道如何解决。我不觉得我有一个175199行的超大数据集。我以前在超过5mio行的数据帧上使用过unstack对于完整的分析,df甚至会变大2倍

我尝试使用
df\u unstacked=df.unstack(级别=0)

附加信息 在pivot/unstack之前,我必须添加一个唯一的索引,其df['row_num']=np.arange(len(df))
,因为数据集包含(需要)重复的索引项。这是由于夏时制,即10月的一天有25个小时。第二个小时重复

我在使用Python3.7的virtualenv中使用Jupyterlab

软件包版本:

  • 熊猫==1.1.2
  • numpy==1.19.2
  • jupyterlab==2.2.8
示例数据 期望结果 索引将包含重复项。作为记录,我不在乎它是索引还是常规列

                     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等,那么每次转换都会创建一个新变量,并增加内存消耗。因此,在这个过程中清除内存是很重要的。即使你的数据看起来不足以消耗你所有的内存

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

因此,第一步是使用简单的“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)

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

我认为这可能是pandas或numpy中的一个错误。有不同的pandas和numpy版本(Anaconda vs.pip)的不同网络错误消息。我自己编写了转换代码,它很快就会运行

# Get the 2017 timestamp for the side_df
side_df = pd.DataFrame ({'timestamp': next_df.loc[next_df['year'] == 2017]['target_frame']})

for year in next_df['year'].unique():
    
    side_df[year] = next_df.loc[next_df['year'] == year]['value']

display(side_df)
结果:

                timestamp     2016     2017     2018     2019     2020
8839  2017-01-01 01:00:00  10,3706   4,4184  14,7919  30,6942  31,0594
8840  2017-01-01 01:15:00  27,2456  23,7641  31,0019  40,2778  46,8350
8841  2017-01-01 01:30:00  20,4022  14,9732  23,8531  34,4941  41,3688
8842  2017-01-01 01:45:00  14,4911   9,4986  17,0181  28,8678  37,8213
8843  2017-01-01 02:00:00  14,2611   5,1241  14,0869  24,3203  34,4150
...                   ...      ...      ...      ...      ...      ...
43874 2017-12-31 23:45:00  10,9256  15,2959  22,6000  40,1677      NaN
43875 2017-01-01 00:00:00  10,9706   4,8184  11,5150  30,9208      NaN
43876 2017-01-01 00:15:00  35,6275  25,8251  30,2893  41,5722      NaN
43877 2017-01-01 00:30:00   24,555  17,7821  24,2928  35,5510      NaN
43878 2017-01-01 00:45:00     5,61  11,7059  20,0477  31,2884      NaN

数据集中仍存在一些问题(如NAN),但这与此问题无关。

您好,感谢您的努力。我遗漏了一些东西,为什么我的数据有20亿条记录?我有175.200行。也许这就是问题的一部分?如果我把df保存到pickle,它有~5MB的Edit:好的,我明白你的意思了。numpy错误的特点是有20亿条记录。但是为什么呢?对!我估计它有175000行和多列,而在这个例子中只有一个示例。但是,如果数据非常小,那么问题一定出在应用重塑的函数中,它们的行为与您期望的不一样,并且正在以一种会导致内存消耗激增的方式格式化数据。如果参数调整得很好,试着回顾一下您是如何使用这些函数的,并将中间步骤可视化。如果一切正常,试着用很少的数据进行操作,这样即使有bug,你也可以看到发生了什么,理解问题是什么。
                timestamp     2016     2017     2018     2019     2020
8839  2017-01-01 01:00:00  10,3706   4,4184  14,7919  30,6942  31,0594
8840  2017-01-01 01:15:00  27,2456  23,7641  31,0019  40,2778  46,8350
8841  2017-01-01 01:30:00  20,4022  14,9732  23,8531  34,4941  41,3688
8842  2017-01-01 01:45:00  14,4911   9,4986  17,0181  28,8678  37,8213
8843  2017-01-01 02:00:00  14,2611   5,1241  14,0869  24,3203  34,4150
...                   ...      ...      ...      ...      ...      ...
43874 2017-12-31 23:45:00  10,9256  15,2959  22,6000  40,1677      NaN
43875 2017-01-01 00:00:00  10,9706   4,8184  11,5150  30,9208      NaN
43876 2017-01-01 00:15:00  35,6275  25,8251  30,2893  41,5722      NaN
43877 2017-01-01 00:30:00   24,555  17,7821  24,2928  35,5510      NaN
43878 2017-01-01 00:45:00     5,61  11,7059  20,0477  31,2884      NaN