在Polars中按周分组,自动对列聚合min/max/avg并生成列表值
在Polars中自动对多列执行聚合并返回列表结果的实现方法
完全可以实现,无需手动指定列名,Polars提供了灵活的动态列选择和表达式组合能力,以下是具体实现方式:
核心思路
- 自动筛选目标列:排除不需要聚合的
ts(时间戳)和week列,仅保留传感器数值列 - 批量生成聚合表达式:对每个目标列,一次性计算
min、max、mean三个指标,并将结果打包为列表
代码实现
方式1:通过列名筛选(直观可控)
import polars as pl # 示例DataFrame(模拟你的数据结构) df = pl.DataFrame({ "ts": pl.date_range(start="2024-01-01", end="2024-01-14", interval="1d"), "646150": pl.randn(14), "646151": pl.randn(14), "week": pl.date_range(start="2024-01-01", end="2024-01-14", interval="1d").dt.week() }) # 自动聚合逻辑 result = df.group_by("week").agg( [ # 对每个传感器列,将min/max/mean打包为列表 pl.struct([pl.col(col).min(), pl.col(col).max(), pl.col(col).mean()]).to_list().alias(col) for col in df.columns if col not in ["ts", "week"] ] ) print(result)
方式2:通过排除列动态选择(更简洁)
直接使用pl.exclude排除非目标列,无需手动遍历列名,适配任意数量的传感器列:
result = df.group_by("week").agg( pl.col(pl.exclude("ts", "week")).map( lambda s: pl.struct([s.min(), s.max(), s.mean()]).to_list() ) )
结果说明
执行后,每个传感器列的单元格会以[最小值, 最大值, 平均值]的列表形式存储对应周的聚合结果,完全满足无需手动指定列名的需求。
内容的提问来源于stack exchange,提问作者Glenn Pierce
相关产品推荐
相关产品推荐

