【发布时间】:2019-05-14 17:10:31
【问题描述】:
我遇到了一个奇怪的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 不直接参与失败的代码部分),第一种方法也可以,所以这让我更加困惑。
这是怎么回事?
【问题讨论】:
-
旁注/可能相关:使用
'sum'而不是sum,您应该避免将Python 内置函数与Pandas / NumPy 对象一起使用。 -
但是为什么,@jpp?使用内建的开销不是更少吗?
-
@ayorgo,不是 NumPy:see here。
-
@jpp 是的,“避免使用 Python 内置函数”在这里当然是正确的,但我相信传递
sum映射到 NumPy ufunc。见pandas.core.base.SelectionMixin;SelectionMixin._builtin_table.get(sum, sum) -
@BradSolomon,很好,不知道!虽然我认为在一般情况中使用字符串是一种很好的做法。该映射似乎是一个实现细节?
标签: python pandas pandas-groupby