我有下表。
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
但是我不知道如何将它们折回原始表的行中。
答案 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