问题描述
我想取消堆叠或旋转 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 在 virtualenv 中使用 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/