【问题标题】:pivot_table requires more memory if dtype is category (MemoryError)如果 dtype 是类别,则 pivot_table 需要更多内存 (MemoryError)
【发布时间】:2018-11-29 20:58:05
【问题描述】:

我在使用 pandas(pandas==0.23.1) 时出现以下奇怪错误:

import pandas as pd
df = pd.DataFrame({'t1': ["a","b","c"]*10000, 't2': ["x","y","z"]*10000, 'i1': list(range(5000))*6, 'i2': list(range(5000))*6, 'dummy':0})
# works fast with less memory
piv = df.pivot_table(values='dummy', index=['i1','i2'], columns=['t1','t2'])

d2 = df.copy()
d2.t1 = d2.t1.astype('category')
d2.t2 = d2.t2.astype('category')

# needs > 20GB of memory and takes for ever
piv2 = d2.pivot_table(values='dummy', index=['i1','i2'], columns=['t1','t2'])

我想知道这是否是预期的,我做错了什么,或者这是否是 pandas 中的错误。 str 的 dtype category 是否应该不是很透明(对于这个用例)?

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    这不是错误。 pandas.pivot_table 正在计算石斑鱼类别的笛卡尔积。

    这是known intended behaviour。在 Pandas v0.23.0 中,我们看到为 pandas.groupby 引入了 observed 参数。设置observed=True 只包括观察到的组合;默认为False。这个论点还没有推广到pandas.pivot_table等相关方法。在我看来,应该是。

    但现在让我们看看这意味着什么。我们可以使用一个示例数据框,看看当我们print 结果时会发生什么。

    设置

    我们使数据框变得更小:

    import pandas as pd
    
    n = 10
    
    df = pd.DataFrame({'t1': ["a","b","c"]*n, 't2': ["x","y","z"]*n,
                       'i1': list(range(int(n/2)))*6, 'i2': list(range(int(n/2)))*6,
                       'dummy':0})
    

    无类别

    这可能是您正在寻找的。未观察到的类别组合不会出现在您的数据透视表中。

    piv = df.pivot_table(values='dummy', index=['i1','i2'], columns=['t1','t2'])
    print(piv)
    
    t1     a  b  c
    t2     x  y  z
    i1 i2         
    0  0   0  0  0
    1  1   0  0  0
    2  2   0  0  0
    3  3   0  0  0
    4  4   0  0  0
    

    有类别

    对于类别,所有类别的组合,甚至是未观察到的组合,都将计入结果中。这在计算上是昂贵的并且需要大量内存。此外,数据帧由来自未观察到的组合的NaN 主导。这可能不是你想要的。

    d2 = df.copy()
    d2.t1 = d2.t1.astype('category')
    d2.t2 = d2.t2.astype('category')
    
    piv2 = d2.pivot_table(values='dummy', index=['i1','i2'], columns=['t1','t2'])
    print(piv2)
    
    t1       a           b            c         
    t2       x   y   z   x    y   z   x   y    z
    i1 i2                                       
    0  0   0.0 NaN NaN NaN  0.0 NaN NaN NaN  0.0
       1   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
       2   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
       3   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
       4   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
    1  0   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
       1   0.0 NaN NaN NaN  0.0 NaN NaN NaN  0.0
       2   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
       3   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
       4   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
    2  0   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
       1   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
       2   0.0 NaN NaN NaN  0.0 NaN NaN NaN  0.0
       3   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
       4   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
    3  0   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
       1   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
       2   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
       3   0.0 NaN NaN NaN  0.0 NaN NaN NaN  0.0
       4   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
    4  0   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
       1   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
       2   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
       3   NaN NaN NaN NaN  NaN NaN NaN NaN  NaN
       4   0.0 NaN NaN NaN  0.0 NaN NaN NaN  0.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 2015-07-11
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多