猿问

如果dtype为类别(MemoryError),则ivot_table需要更多内存

我在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'])

我想知道这是否是预期的,并且我做错了什么,或者这是否是熊猫中的错误。dtype categoryfor应该str不是非常透明的(对于此用例)?


人到中年有点甜
浏览 166回答 1
1回答

慕姐8265434

这不是错误。正在发生的事情是pandas.pivot_table计算石斑鱼类别的笛卡尔积。这是已知的预期行为。在Pandas v0.23.0中,我们看到了的observed参数介绍pandas.groupby。设置observed=True仅包括观察到的组合;它是False默认。此参数尚未推广到相关方法,例如pandas.pivot_table。我认为应该如此。但是现在让我们看看这意味着什么。我们可以使用一个示例数据框,看看print结果如何。设置我们使数据框大大缩小:import pandas as pdn = 10df = 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  ct2     x  y  zi1 i2         0  0   0  0  01  1   0  0  02  2   0  0  03  3   0  0  04  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    zi1 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  NaN1  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  NaN2  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  NaN3  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  NaN4  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
随时随地看视频慕课网APP

相关分类

Python
我要回答