dask groupby没有组合分区

时间:2018-06-12 22:32:04

标签: python pandas dask

我有一组数据,我想要一些简单的groupby / count操作,我似乎无法使用dask。

我很可能不理解在dask中执行groupby / reduce的方式,特别是当索引在分组键中时。所以我将用玩具数据说明我的问题。

首先,我创建一个包含3列的数据框。

import pandas as pd
import numpy as np

np.random.seed(0)
df = pd.DataFrame(
    {"A": np.random.randint(6, size=20),
     "B": np.random.randint(6, size=20),
     "C": np.random.rand(20)}
 )
 df = df.set_index("A")

所以我有一个带索引和2列的数据框。在熊猫我会做:

result = df.groupby(["A", "B"]).C.count().reset_index().set_index("A")

最后,我想将结果保存在镶木地板文件中。

现在让我们来看看,我基本上可以做同样的操作:

import dask.dataframe as dd
ddf = dd.from_pandas(df, npartitions=4)
result = ddf.groupby(["A", "B"]).C.count().reset_index().set_index("A")

调用计算会导致相同的结果。但是,在检查图表时,我发现:

Computation Graph for GroupBy/Count

我们看到一切都缩减为一个分区。我可以理解,当要分组的数据分布在不同的分区中或实际分组键的数量很小时,这或多或少是必要的。

但在我的情况下,索引在parition中,所以我期望一个完全平行的图形。此外,分组键的数量与初始行数相同(除以因子2或3)。

与此代码获得的内容类似:

result = ddf.map_partitions(
     lambda x: x.groupby(
         [x.index, x.B]
     ).C.count().reset_index().set_index("A")
)

给出了以下图表: Parallel computation graph

那么有没有办法用普通的groupby / reduce dask函数来获得这个并行图?

当分组键的数量非常大时,这非常重要。

0 个答案:

没有答案