如果我按字段有多个组,如何从Dask DataFrameGroupBy中获取所有组?

时间:2018-02-19 16:31:21

标签: python dataframe dask

如何从分组数据框中获取Dask中的所有唯一组? 我们说,我们有以下代码:

g = df.groupby(['Year', 'Month', 'Day'])

我必须遍历所有组并处理组内的数据。 我的想法是获得所有独特的价值组合,然后遍历集合并调用例如

g.get_group((2018,01,12)).compute() 

对于他们每个人......这不会很快,但希望能够奏效......

在Spark / Scala中,我可以使用以下方法实现这样的smth:

val res = myDataFrame.groupByKey(x => groupFunctionWithX(X)).mapGroups((key,iter) => {
 process group with all the child records
} )

我想知道,使用Dask / Python实现这样的smth的最佳方法是什么?

非常感谢任何帮助!

最好,迈克尔

更新

我在pandas的python中尝试了以下内容:

df = pd.read_parquet(path, engine='pyarrow')
g = df.groupby(('Year', 'Month', 'Day'))
g.apply(lambda x: print(x.Year[0], x.Month[0], x.Day[0], x.count()[0]))

这一切都很好。之后,我尝试了同样的Dask:

df2 = dd.read_parquet(path, engine='pyarrow')
g2 = df2.groupby(('Year', 'Month', 'Day'))
g2.apply(lambda x: print(x.Year[0], x.Month[0], x.Day[0], x.count()[0]))

这导致我出现以下错误:

ValueError: Metadata inference failed in `groupby.apply(lambda)`.

任何想法出了什么问题?

1 个答案:

答案 0 :(得分:2)

一次计算一个组可能会很慢。相反,我建议使用groupby-apply

df.groupby([...]).apply(func)

与Pandas一样,用户定义的函数func应该期望Pandas数据帧具有与该组对应的所有行,并且应该返回Pandas数据帧,Pandas系列或标量。

如果您的数据由分组列

编制索引,那么一次获取一个组可能很便宜
df = df.set_index('date')
part = df.loc['2018-05-01'].compute()

鉴于你是按几列分组的,虽然我不确定它会有多好用。