为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

人到中年有点甜 2021-03-30 15:14:26
我在pandas(pandas == 0.23.1)中遇到以下奇怪的错误:import pandas as pddf = 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 memorypiv = 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 everpiv2 = d2.pivot_table(values='dummy', index=['i1','i2'], columns=['t1','t2'])我想知道这是否是预期的,并且我做错了什么,或者这是否是熊猫中的错误。dtype categoryfor应该str不是非常透明的(对于此用例)?
查看完整描述

1 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

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


这是已知的预期行为。在Pandas v0.23.0中,我们看到了的observed参数介绍pandas.groupby。设置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


查看完整回答
反对 回复 2021-04-09
  • 1 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号