我遇到了一个奇怪的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)
应该有帮助。
我是一名优秀的程序员,十分优秀!