如果dtype为类别(MemoryError)

时间:2018-06-20 16:31:23

标签: python python-3.x pandas dataframe

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

我想知道这是否是预期的,并且我做错了什么,或者这是否是熊猫中的错误。为category的dtype str是否应该非常透明(在这种情况下)?

1 个答案:

答案 0 :(得分:2)

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

这是known intended behaviour。在Pandas v0.23.0中,我们看到了pandas.groupbyobserved参数的引入。设置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