gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:51:47 25 4
gpt4 key购买 nike

问题描述
我想取消堆叠或旋转 DataFrame,但它会引发 numpy 异常 MemoryError: Unable to allocate 1.72 GiB for an array with shape (1844040704,) and data type bool 。我已经尝试过使用带有数字索引 -> df.pivot() 和 Multiindex -> df.unstack() 的 DataFrame ]。两者都显示相同的异常,我不知道解决办法。我不觉得我有一个包含 175199 行的特别大的数据集。我以前在超过 5mio 行的 DataFrames 上使用过 unstack。 对于完整的分析,df 甚至会变大 2 倍!
我尝试使用 df_unstacked = df.unstack(level=0) 进行拆栈
附加信息
在数据透视/取消堆栈之前,我必须使用 df['row_num'] = np.arange(len(df)) 添加一个唯一索引,因为数据集包含(想要的)重复索引条目。那是由于夏令时,十月的一天有 25 小时。第 2 个小时是重复的。
我使用 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 等,则每次转换都会创建一个新变量,并增加内存消耗。所以在这个过程中清除内存很重要。即使您的数据看起来不足以消耗所有内存。
    解决此问题的一种方法是处理“块”并将每个转换步骤保存到文件中以清除内存。
    所以第一步是保存文件,用一个简单的“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 并根据需要使用连接函数进行分析。

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com