python - 避免大型 Pandas DataFrame 上 GroupBy 的内存问题

标签 python pandas dataframe memory dask

更新:

pandas df 是这样创建的:

df = pd.read_sql(query, engine)
encoded = pd.get_dummies(df, columns=['account'])

从这个 df 创建一个 dask df 看起来像这样:

df = dd.from_pandas(encoded, 50)

使用 dask 执行操作不会产生可见的进展(使用 dask 诊断进行检查):

result = df.groupby('journal_entry').max().reset_index().compute()

原文:

我有一个 Pandas df,有 270 万行和 4,000 列。除了四列之外,所有列都是 dtype uint8。 uint8 列仅包含 1 或 0 的值。我正在尝试对 df 执行此操作:

result = df.groupby('id').max().reset_index()

不出所料,这个操作会立即返回一个内存错误。我最初的想法是水平和垂直分块 df。但是,这会造成困惑,因为 .max() 需要在所有 uint8 列上执行,而不仅仅是一对列。此外,像这样分块 df 仍然非常慢。我的机器上有 32 GB 的 RAM。

什么策略可以缓解内存问题?

最佳答案

如果您的数据中有任何分类列(而不是存储为对象列或字符串的类别),请确保在 groupby 命令中使用 observed=True 选项。这确保它只创建存在条目的行,例如每个 customer_id、order_id 组合只有一行,而不是创建 n_custs * n_orders 行!

我刚刚对 2600 万行数据集进行了分组求和,从未超过 7GB RAM。在添加 observed=True 选项之前,它会上升到 62GB,然后用完。

关于python - 避免大型 Pandas DataFrame 上 GroupBy 的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50051210/

相关文章:

python - Django + mod_wsgi。从 Apache 的 SetEnv 设置操作系统环境变量

python - 我应该返回一个通过引用传递并修改过的列表吗?

python Pandas : getting session start and end time to calculate session length

python - Pandas :TypeError:在日期列上选择时, '>' 和 'int' 实例之间不支持 'str'

pandas - 将数据帧的列中的某些条目替换为另一个数据帧的列

python - 如何使用 Tensorflow 数据集进行 CNN 模型训练

Python读取pickle协议(protocol)4错误: STACK_GLOBAL requires str

python - 在 Pandas 中有效地使用替换

python - 查找具有最高值的列( Pandas )

python - 在@property 之后装饰类方法