You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在不使用groupby的情况下对Dask DataFrame执行聚合并模拟Pandas agg行为?

当然可以实现!虽然Dask DataFrame没有像Pandas那样直接提供对整个无分组DataFrame的agg方法,但咱们可以用几个小技巧轻松模拟这个行为,下面给你两种实用的方案:

方案1:用虚拟分组键实现全局聚合

最简洁的方式就是给整个DataFrame添加一个值完全相同的虚拟列,然后基于这个列做groupby,最后去掉分组索引即可。这种方式和你用Pandas的df.agg()逻辑最接近:

import dask.dataframe as dd
import pandas as pd

# 先创建示例Pandas DataFrame,再转为Dask DataFrame
pdf = pd.DataFrame(
    [
        ("1", 1, 0, 0),
        ("2", 2, 0, 0),
        ("3", 3, 0, 0),
        ("4", 4, 5, 4),
        ("5", 5, 6, 6),
        ("6", 6, 7, 7),
    ],
    columns=("item", "att1", "att2", "att3"),
)
ddf = dd.from_pandas(pdf, npartitions=2)

# 添加虚拟分组列,执行聚合后移除分组索引
result = ddf.assign(dummy=1).groupby("dummy").agg(["mean", "max", "sum"]).reset_index(drop=True)
# 可选:移除列的层级索引,让结果和Pandas输出格式一致
result.columns = result.columns.droplevel(0)

# 计算并查看结果
print(result.compute())

运行后你会得到和Pandas几乎一致的输出,注意字符串列item的聚合逻辑,Dask会自动处理(和Pandas一样,对字符串的mean会转成整数后计算,sum会拼接字符串转成整数的总和)。

方案2:逐列计算聚合后合并结果

如果需要对不同列自定义聚合逻辑,这种方法会更灵活。我们可以遍历每一列,分别计算需要的聚合值,最后把所有结果合并成一个DataFrame:

import dask.dataframe as dd
import pandas as pd

pdf = pd.DataFrame(
    [
        ("1", 1, 0, 0),
        ("2", 2, 0, 0),
        ("3", 3, 0, 0),
        ("4", 4, 5, 4),
        ("5", 5, 6, 6),
        ("6", 6, 7, 7),
    ],
    columns=("item", "att1", "att2", "att3"),
)
ddf = dd.from_pandas(pdf, npartitions=2)

# 定义需要的聚合函数
required_aggs = ["mean", "max", "sum"]

# 遍历每一列,计算对应的聚合值
aggregation_results = {}
for col in ddf.columns:
    col_aggs = {}
    for agg_func in required_aggs:
        # 针对字符串列`item`做特殊处理,和Pandas逻辑对齐
        if col == "item":
            if agg_func == "mean":
                col_aggs[agg_func] = ddf[col].astype(int).mean()
            elif agg_func == "sum":
                col_aggs[agg_func] = ddf[col].astype(int).sum()
            else:
                col_aggs[agg_func] = ddf[col].max()
        # 数值列直接调用对应聚合方法
        else:
            col_aggs[agg_func] = getattr(ddf[col], agg_func)()
    aggregation_results[col] = col_aggs

# 将结果转为Dask DataFrame并计算
final_result = dd.from_pandas(pd.DataFrame(aggregation_results), npartitions=1)
print(final_result.compute())

这种方法的优势是可以针对不同列定制聚合逻辑,比如某些列只需要计算sum,某些列需要额外的自定义函数,都能轻松实现。

内容的提问来源于stack exchange,提问作者mfcabrera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 11:47:53