Python Pandas unstack()和pivot():MemoryError 问题描述
我想取消数据帧的堆栈或透视,但它会引发numpy异常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
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