python 如果dtype是类别,则pivot_table需要更多内存(MemoryError)

0yg35tkg  于 2022-10-30  发布在  Python
关注(0)|答案(1)|浏览(141)

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

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

e4yzc0pl

e4yzc0pl1#

这不是一个bug,发生的是pandas.pivot_table在计算石斑鱼分类的笛卡尔积。
这是一个known intended behaviour。在Pandas v0.23.0中,我们看到pandas.groupby引入了observed参数。设置observed=True只包括观察到的组合;默认情况下是False。这个参数还没有推广到相关的方法中,比如pandas.pivot_table。在我看来,应该是。
但是现在让我们来看看这意味着什么。我们可以使用一个示例 Dataframe ,看看当我们对结果进行print时会发生什么。

设置

我们将 Dataframe 做得更小:

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

包含类别

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

**更新:**您现在可以将observed参数设置为True,以便仅显示分类分组的观测值。

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

相关问题