问题概述:
为什么Dask会加载所有分区并返回Pandas(而不是Dask)数据帧来执行.drop()
如何解决这个现实,以便在对我的机器来说太大的数据帧上进行基本数据集工程?
详细信息
除非错误,否则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
答案 0 :(得分:0)
您的问题相当模糊,建议我应阅读更多的入门教程,示例和文档。
关键在这里:
为什么组成Dask数据帧的各个数据帧都需要作为Pandas数据帧返回。
您不需要!检查Dask管道输出的一些具体值可能很有用,也许可以使用.head()
。但是,通常您希望输出数据(例如.to_parquet()
)或将其汇总到 在内存中可以处理的更小的数据集。
https://docs.dask.org/en/latest/dataframe-best-practices.html