如何在数据帧的子集上有效地运行groupby()以避免MemoryError

时间:2016-11-16 21:05:04

标签: python pandas memory

我想要使用df.shape = (4000000, 2000)的数据帧(大致为.groupby().max())。不幸的是,我的笔记本电脑和我无法访问的服务器都可以做到这一点而不会抛出MemoryError(笔记本电脑有16G的RAM,服务器有64个。)这很可能是由于很多列中的数据类型。现在,我正在考虑那些是固定的和不可变的(许多,许多日期,大整数等),但也许这可能是解决方案的一部分。

我想要的命令只是new_df = df.groupby('KEY').max()

解决此问题以防止遇到内存问题的最有效方法是什么?我试过的一些事情,取得了不同的成功:

  1. df分成子集并在这些子集上运行.groupby().max,然后连接。问题:完整df的大小可能会有所不同,而且可能会增长。我不确定将df分开的最佳方法,以便子集绝对不会抛出MemoryError。

  2. 在新.groupby()中包含要在其中运行df的列子集,然后将其与原始列合并。问题:此子集中的列数可能不同(远小于或大于当前值),但列的名称都包含前缀ind_

  3. 寻找内存不足的管理工具。到目前为止,我还没有找到任何有用的东西。
  4. 感谢您提供的任何见解或帮助。

    编辑添加信息

    数据用于预测建模练习,列数源于从一列离散(非连续/分类)值中生成二进制变量。如果另一列值经过相同的过程,df将以列大小增长。此外,数据最初是从SQL查询中提取的;查询找到的项集可能会随着时间的推移而增长,这意味着行数将增长,并且(由于一列或多列中的不同值的数量可能会增长,因此在生成二进制指示符变量之后的列数也会增加)。拉出的数据经过了大量的转换,并与其他数据集合并,使得在数据库中运行分组难以置信。

    KEY的重复观察,除了列I变成指标外,它们具有相同的值(这只是为了显示形状/值样本:实际df有日期,整数16位或更长,等):

    KEY    Col1  Col2   Col3
     A      1    blue   car
     A      1    blue   bike
     A      1    blue   train
     B      2    green  car
     B      2    green  plane
     B      2    green  bike 
    

    这应该成为,与愚蠢的Col3:

    KEY    Col1  Col2   ind_car ind_bike ind_train ind_plane
     A      1    blue      1        1        1         0
     B      2    green     1        1        0         1   
    

    因此.groupby('KEY')获取组,而.max()获取具有正确值的新指示符列。我知道`.max()'进程可能因字符串或日期列的“max”而陷入困境。

0 个答案:

没有答案