我有一组数据,我想要一些简单的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函数来获得这个并行图?
当分组键的数量非常大时,这非常重要。