首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dask DataFrame.assign炸毁dask图

dask DataFrame.assign炸毁dask图
EN

Stack Overflow用户
提问于 2017-02-02 06:25:09
回答 1查看 299关注 0票数 3

所以我对dask DataFrame.append有个问题。我从主数据中生成了许多派生特征,并将它们附加到主数据框架中。在此之后,任何一组列的dask图都会被放大。下面是一个小示例:

代码语言:javascript
复制
%pylab inline
import numpy as np
import pandas as pd
import dask.dataframe as dd
from dask.dot import dot_graph

df=pd.DataFrame({'x%s'%i:np.random.rand(20) for i in range(5)})
ddf = dd.from_pandas(df, npartitions=2)

dot_graph(ddf['x0'].dask)

here is the dask graph as expected

代码语言:javascript
复制
g=ddf.assign(y=ddf['x0']+ddf['x1'])
dot_graph(g['x0'].dask)

here the graph for same column is exploded with irrelevant computation

想象一下,我有很多生成的列。因此,任何特定列的计算图都包括所有其他列的不相关计算。也就是说,在我的例子中,len(ddf‘’someColumn‘.dask)>100000。所以它很快就变得不可用了。

所以我的问题是这个问题能解决吗?是否有任何现有的方法可以做到这一点?如果不是--我应该朝什么方向去实现它呢?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-02 06:34:18

您可能希望构建几个dask系列,然后在最后将它们连接在一起,而不是不断地将新列分配给dask数据帧

因此,与其这样做:

代码语言:javascript
复制
df['x'] = df.w + 1
df['y'] = df.x * 10
df['z'] = df.y ** 2

执行此操作

代码语言:javascript
复制
x = df.w + 1
y = x + 10
z = y * 2
df = df.assign(x=x, y=y, z=z)

或者这样:

代码语言:javascript
复制
dd.concat([df, x, y, z], axis=1)

然而,这可能仍然会导致图形中的任务数量相同,但可能会导致较少的内存副本。

或者,如果所有转换都是按行进行的,那么可以构造一个pandas函数并将其映射到所有分区

代码语言:javascript
复制
def f(part):
    part = part.copy()
    part['x'] = part.w + 1
    part['y'] = part.x * 10
    part['z'] = part.y ** 2
    return part

df = df.map_partitions(f)

此外,虽然百万节点的任务图不太理想,但它也应该是可以的。我见过较大的图形运行起来很舒服。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41990976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档