如何处理Dask的group by返回的组?

时间:2019-10-17 19:30:38

标签: dask

我有下表。

    value   category
0   2       A
1   20      B
2   4       A
3   40      B

我想添加一个mean列,其中包含每个类别的值的平均值。

    value   category  mean
0   2       A          3.0
1   20      B         30.0
2   4       A          3.0
3   40      B         30.0

我可以像这样在熊猫上做

p = pd.DataFrame({"value":[2, 20, 4, 40], "category": ["A", "B", "A", "B"]})
groups = []
for _, group in p.groupby("category"):
    group.loc[:,"mean"] = group.loc[:,"value"].mean()
    groups.append(group)
pd.concat(groups).sort_index()

我如何在Dask中做同样的事情?

我不能按原样使用pandas函数,因为您无法枚举Dask中的groupby对象。这个

import dask.dataframe as dd

d = dd.from_pandas(p, chunksize=100)
list(d.groupby("category"))

提高KeyError: 'Column not found: 0'

我可以使用apply函数来计算Dask中的均值。

import dask.dataframe as dd

d = dd.from_pandas(p, chunksize=100)
q = d.groupby(["category"]).apply(lambda group: group["value"].mean(), meta="object")
q.compute()

返回

category
A     3.0
B    30.0
dtype: float64

但是我不知道如何将它们折回原始表的行中。

1 个答案:

答案 0 :(得分:1)

我将使用合并来实现此操作:

import dask.dataframe as dd
import pandas as pd

df = pd.DataFrame({
    'value': [2, 20, 4, 40],
    'category': ['A', 'B', 'A', 'B']
})
ddf = dd.from_pandas(df, npartitions=1)

# Lazy-compute mean per category
mean_by_category = (ddf
                   .groupby('category')
                   .agg({'value': 'mean'})
                   .rename(columns={'value': 'mean'})
                   ).persist()
mean_by_category.head()

# Assign 'mean' value to each corresponding category
ddf = ddf.merge(mean_by_category, left_on='category', right_index=True)
ddf.head()

然后应该输出:

  category  value  mean
0        A      2   3.0
2        A      4   3.0
1        B     20  30.0
3        B     40  30.0