为什么我收到此MemoryError?

时间:2018-12-13 13:10:07

标签: python pandas pandas-groupby

我遇到了一个奇怪的MemoryError,但我不明白为什么会出现它。代码示例:

# some setup
import numpy as np
import pandas as pd
import random

blah = pd.DataFrame(np.random.random((100000,2)), columns=['foo','bar'])
blah['cat'] = blah.apply(lambda x: random.choice(['A','B']), axis=1)
blah['bat'] = blah.apply(lambda x: random.choice([0,1,2,3,4,5]), axis=1)

# the relevant part:
blah['test'] = np.where(blah.cat == 'A',
    blah[['bat','foo']].groupby('bat').transform(sum),
    0)

以这种方式分配blah['test']会因MemoryError而崩溃,但但是:如果我改为这样做:

blah['temp'] = blah[['bat','foo']].groupby('bat').transform(sum)
blah['test'] = np.where(blah.cat == 'A',
    blah['temp'],
    0)

一切正常。我的猜测是,np.where.groupby()的相互作用如何导致了这种情况。

但是,如果我的首字母blah仅包含列'foo', 'cat', 'bat'(因此没有列bar没有直接与失败的代码部分相关),第一个也可以这样做的方式,让我更加困惑。

这是怎么回事?

2 个答案:

答案 0 :(得分:2)

代码的第一部分根本不正确。如果减小数据框大小,则会得到

ValueError: Wrong number of items passed 1000, placement implies 1

这表明np.where无法遍历由...返回的单列数据帧

blah[['bat','foo']].groupby('bat').transform(sum)

并尝试将整个列放在blah['test']的每个元素上,大概是为整个操作分配了内存,这会导致MemoryError

将实现更改为

blah['test'] = np.where(blah.cat == 'A',
                        blah[['bat','foo']].groupby('bat')['foo'].transform(sum),
                        0)

应该有帮助。

答案 1 :(得分:0)

blah['test'] = np.where(blah['cat'] == 'A',
    blah[['bat','foo']].groupby('bat')['bat'].transform(sum),
    0)

请注意,我在['bat']的末尾添加了一个groupby('bat')

我的理由是您的python遇到MemoryError是因为它试图sum数据框中的所有内容,因为它没有明确定义sum