开发者社区> 问答> 正文

借助自定义功能轻松实现

我正在尝试使用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

展开
收起
is大龙 2020-03-23 18:54:30 480 0
1 条回答
写回答
取消 提交回答
  • 也许此警告是关键(Dask文档:SeriesGroupBy.apply):

    熊猫的groupby-apply可用于应用任意功能,包括导致每个组一行的聚合。Dask的groupby-apply 将func应用于每个分区组对,因此,当func减少时,每个分区组对将只有一行。要对Dask应用自定义聚合,请使用dask.dataframe.groupby.Aggregation。

    回答来源:stackoverflow

    2020-03-23 18:54:37
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
动态、高效,蚂蚁动态卡片的内核逻辑 立即下载
软件定义的数据智能 立即下载
“静态调用链路发现“在APM中的应用场景分析及实践探索 立即下载