更新:
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/