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

如何在Polars DataFrame中以聚合函数为索引生成便于跨月份对比的汇总视图

如何在Polars DataFrame中以聚合函数为索引生成便于跨月份对比的汇总视图

嘿,这个需求太实用了——当数据集变大、聚合指标变多的时候,横向对比不同月份的数值确实比原来的长格式清晰多了!其实你不用搞什么辅助DataFrame,用Polars自带的melt+pivot组合就能轻松实现,我给你一步步演示:

完整实现代码

我们可以把整个流程链式写在一起,既简洁又高效:

import polars as pl

df = pl.DataFrame({
    "Channel": ["X", "X", "Y", "Y", "X", "X", "Y", "Y", "X", "X", "Y", "Y", "X", "X", "Y", "Y"],
    "ID": ["a", "b", "b", "a", "e", "b", "g", "h", "a", "a", "k", "a", "b", "n", "o", "p"],
    "Month": ["1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2"]
})

result = (
    # 第一步:完成基础的分组聚合,和你原来的逻辑一致
    df.group_by(["Month", "Channel"])
    .agg(
        pl.col("ID").n_unique().alias("Uniques ID"),
        pl.col("ID").len().alias("Total sends")
        # 这里可以加任意多的聚合函数,比如pl.col("ID").sum().alias("Total XX")之类的
    )
    # 第二步:把宽格式的聚合列转成长格式,生成聚合函数名称列和对应值列
    .melt(id_vars=["Month", "Channel"], variable_name="agg_func", value_name="value")
    # 第三步:将月份转成列,以渠道和聚合函数作为行索引
    .pivot(index=["Channel", "agg_func"], columns="Month", values="value")
    # 可选:按渠道和聚合函数排序,让结果更规整
    .sort("Channel", "agg_func")
)

print(result)

执行结果

输出的格式完全符合你的预期,完美支持跨月份对比:

shape: (4, 4)
┌─────────┬─────────────┬──────┬──────┐
│ Channel ┆ agg_func    ┆ 1    ┆ 2    │
│ ---     ┆ ---         ┆ ---  ┆ ---  │
│ str     ┆ str         ┆ u32  ┆ u32  │
╞═════════╪═════════════╪══════╪══════╡
│ X       ┆ Total sends ┆ 4    ┆ 4    │
│ X       ┆ Uniques ID  ┆ 3    ┆ 3    │
│ Y       ┆ Total sends ┆ 4    ┆ 4    │
│ Y       ┆ Uniques ID  ┆ 4    ┆ 3    │
└─────────┴─────────────┴──────┴──────┘

关键步骤解释

  1. melt转换:把原来宽格式的Uniques ID、Total sends这类聚合列,拆成agg_func(聚合函数名称)和value(对应数值)两列,这样每个渠道-月份-聚合指标的组合都变成一行,为后续的pivot做准备。
  2. pivot重塑:以Channel和agg_func作为行标识,把Month的不同取值转成列,直接把对应月份的数值填充进去,最终得到你想要的横向对比格式。

最棒的是,哪怕你后续加更多聚合函数,这个代码完全不用改——melt会自动识别所有非id列的聚合指标,非常适合你的大型数据集场景!

备注:内容来源于stack exchange,提问作者Simon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:54:38