Как мне работать с группами, возвращенными группой Даска? - PullRequest
0 голосов
/ 17 октября 2019

У меня есть следующая таблица.

    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?

Я не могу использовать функции панд как есть, потому что вы не можете перечислять по группамОбъект в Даске. Это

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 Ответ

1 голос
/ 18 октября 2019

Я бы использовал слияние для выполнения этой операции:

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