python - 如果我有多个字段分组,如何从 Dask DataFrameGroupBy 获取所有分组?

标签 python dataframe dask

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

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

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

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

对于他们每个人......这不会很快,但希望会工作..

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

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

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

如有任何帮助,我们将不胜感激!

最好的,迈克尔

更新

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

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)`.

知道哪里出了问题吗?

最佳答案

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

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

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

如果您的数据是按分组列索引的,则一次获取一个分组可能会很便宜

df = df.set_index('date')
part = df.loc['2018-05-01'].compute()

鉴于您按几列分组,但我不确定这是否有效。

关于python - 如果我有多个字段分组,如何从 Dask DataFrameGroupBy 获取所有分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48870342/

相关文章:

python - TensorFlow - 如何使用每个示例一次且仅一次评估所有测试集

python - 用于 bbcode 输入的自定义 django 管理表单

python - 将字符串重新组合为 2 字符字符串列表的最佳方法

python - 用于删除跨列具有相同内容的连续重复行的数据框

python - 数据框按最大值排序并显示行名称

python - 使用 pandas 查找数据框中重复句子的数量

python - 子类构造函数抛出 TypeError : __init__() takes 2 positional arguments but 5 were given

python - 如何处理修改 Pandas 数据框

python - 如何在 sklearn dbscan 中使用多核?

python - 反转dask分布式数据帧的简单方法