我遇到了一个奇怪的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不会直接与代码的失败部分相关),那么第一种方法也可以,所以很令人困惑我更多。

这里发生了什么?

最佳答案

您的代码的第一部分根本不正确。如果减小数据框大小,您将获得

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)


应该有所帮助。

关于python - 为什么我收到此MemoryError?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53762632/

10-12 15:06