如果大于RAM,则转换Dask数据帧

时间:2019-06-25 15:57:34

标签: python dask

问题概述:

  1. 为什么Dask会加载所有分区并返回Pandas(而不是Dask)数据帧来执行.drop()

  2. 这样的操作
  3. 如何解决这个现实,以便在对我的机器来说太大的数据帧上进行基本数据集工程?

详细信息

除非错误,否则Dask不会像我最初想到的那样运行,也许任何.compute()调用都将尝试加载Dask数据帧的所有分区;如果该操作返回一个数据帧,则属于Pandas类。

我一直在使用Dask来加快对不庞大的数据集(〜300mb)的探索性数据理解的速度。我计划在更大的数据集(约12GB)上遵循类似的步骤,弄清楚了Dask的语法变化(来自Pandas)。在每种情况下,我都打算进行基本的数据清理更改,例如删除常量列。

在处理较小的数据集时,我意识到删除列会导致返回熊猫数据框。我发现这很令人惊讶(例如,所有分区都已读入以进行列删除操作),并且由于内存限制,这显然使我无法在大型数据帧上执行此类更改。

我想知道:

1)我如何使用单台机器(8GB RAM)进行简单的更改,例如将列拖放到〜12GB CSV,读入Dask数据框。我的计划是尽可能缩小数据集的大小,并希望然后与Pandas合作。我想使用Dask而不是涉足关系数据库。

2)读入所有分区是否适用于所有.compute()调用。对于Pandas,删除列将返回一个数据帧,因此也许有些预料之中。但是,假设df.shape[0]返回一个整数,Dask是否为每个Dask数据帧分区存储中间整数,还是再次尝试加载所有分区?

3)为什么构成Dask数据框的各个数据框都需要作为Pandas数据框返回。正如this张贴者所指出的:“由于记忆问题,大熊猫的转化可能会失败……这就是我开始使用Dask的原因。”

我是达斯克(Dask)的新手,没有熊猫专家,但对此行为感到非常惊讶。

促使我意识到这一点的代码是:

keep_cols = df.drop([
    'col',
    'another_col',
    'and_another_col'],
    axis=1)


df = keep_cols.compute()

type(df)

pandas.core.frame.DataFrame

1 个答案:

答案 0 :(得分:0)

您的问题相当模糊,建议我应阅读更多的入门教程,示例和文档。

关键在这里:

  

为什么组成Dask数据帧的各个数据帧都需要作为Pandas数据帧返回。

您不需要!检查Dask管道输出的一些具体值可能很有用,也许可以使用.head()。但是,通常您希望输出数据(例如.to_parquet())或将其汇总到 在内存中可以处理的更小的数据集。

https://docs.dask.org/en/latest/dataframe-best-practices.html