python - 为什么我会收到此内存错误?

标签 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不直接参与代码的失败部分)第一种方法一切都很好,所以这让我更加困惑。

这是怎么回事?

最佳答案

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

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 - 为什么我会收到此内存错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53762632/

相关文章:

python - 按行组合 Pandas 数据帧的有效方法

python - JSON 对象必须是 str,而不是 'bytes' 解析 JSON

python - Pandas dataframe - 如何分配索引?

python - 加快客户mysql切片切 block

python - 如何将数值与 nan 值分开?

python - 如何在 pandas 系列中找到 groupby 函数的比率

Python、MySQL : localhost connection failed

python - 加载具有多个同名字段的数据框

python - Pandas 计数正/负/中性值

python - 其他专栏的 Pandas filldown(我不知道如何命名)