如何在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 │ └─────────┴─────────────┴──────┴──────┘
关键步骤解释
melt转换:把原来宽格式的Uniques ID、Total sends这类聚合列,拆成agg_func(聚合函数名称)和value(对应数值)两列,这样每个渠道-月份-聚合指标的组合都变成一行,为后续的pivot做准备。pivot重塑:以Channel和agg_func作为行标识,把Month的不同取值转成列,直接把对应月份的数值填充进去,最终得到你想要的横向对比格式。
最棒的是,哪怕你后续加更多聚合函数,这个代码完全不用改——melt会自动识别所有非id列的聚合指标,非常适合你的大型数据集场景!
备注:内容来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

