我正在尝试使用Dask,但是在分组后使用apply
时遇到了问题。
我有一个Dask DataFrame,其中包含大量行。让我们考虑例如以下
N=10000
df = pd.DataFrame({'col_1':np.random.random(N), 'col_2': np.random.random(N) })
ddf = dd.from_pandas(df, npartitions=8)
我想对col_1
的值进行bin,然后从这里开始遵循解决方案
bins = np.linspace(0,1,11)
labels = list(range(len(bins)-1))
ddf2 = ddf.map_partitions(test_f, 'col_1',bins,labels)
哪里
def test_f(df,col,bins,labels):
return df.assign(bin_num = pd.cut(df[col],bins,labels=labels))
这可以达到我的预期。
现在我想取每个仓中的中位数(取自此处)
median = ddf2.groupby('bin_num')['col_1'].apply(pd.Series.median).compute()
拥有10个bin,我希望“中位数”有10行,但实际上有80行。数据帧有8个分区,所以我猜想应用程序在某种程度上可以单独处理每个行。
但是,如果我想要平均值并使用mean
median = ddf2.groupby('bin_num')['col_1'].mean().compute()
它有效,输出有10行。
然后的问题是:我在做什么错而阻止apply
充当mean
?
问题来源:stackoverflow
也许此警告是关键(Dask文档:SeriesGroupBy.apply):
熊猫的groupby-apply可用于应用任意功能,包括导致每个组一行的聚合。Dask的groupby-apply 将func应用于每个分区组对,因此,当func减少时,每个分区组对将只有一行。要对Dask应用自定义聚合,请使用dask.dataframe.groupby.Aggregation。
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。