如何在Polars DataFrame中按分组计算累积均值与标准差?
在Polars中按分组计算累积均值与累积标准差的简洁方法
Polars已经提供了内置的cum_mean()和cum_std()函数,结合over()子句就能轻松实现分组的累积均值与标准差计算,完全不需要手动通过累积求和除以计数这种繁琐且易出错的方式。
1. 分组累积均值的简洁实现
直接使用cum_mean()配合over('class')即可替代手动计算,代码更简洁且结果一致:
import polars as pl df = pl.DataFrame({ 'value': [4, 6, 8, 11, 5, 6, 8, 15], 'class': ['A', 'A', 'B', 'A', 'B', 'A', 'B', 'B'] }) # 计算分组累积均值 result = df.with_columns( cum_mean=pl.col('value').cum_mean().over('class') ) print(result)
运行后输出和手动实现的结果完全一致:
shape: (8, 3) ┌───────┬───────┬──────────┐ │ value ┆ class ┆ cum_mean │ │ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ f64 │ ╞═══════╪═══════╪══════════╡ │ 4 ┆ A ┆ 4.0 │ │ 6 ┆ A ┆ 5.0 │ │ 8 ┆ B ┆ 8.0 │ │ 11 ┆ A ┆ 7.0 │ │ 5 ┆ B ┆ 6.5 │ │ 6 ┆ A ┆ 6.75 │ │ 8 ┆ B ┆ 7.0 │ │ 15 ┆ B ┆ 9.0 │ └───────┴───────┴──────────┘
2. 分组累积标准差的实现
使用内置的cum_std()函数,结合over()即可完成分组累积标准差计算。注意ddof参数:
ddof=1(默认):计算样本标准差(除以n-1)ddof=0:计算总体标准差(除以n)
示例代码:
result = df.with_columns( cum_mean=pl.col('value').cum_mean().over('class'), cum_std_pop=pl.col('value').cum_std(ddof=0).over('class'), # 总体标准差 cum_std_sample=pl.col('value').cum_std(ddof=1).over('class') # 样本标准差 ) print(result)
运行输出:
shape: (8, 4) ┌───────┬───────┬──────────┬────────────┬──────────────┐ │ value ┆ class ┆ cum_mean ┆ cum_std_pop ┆ cum_std_sample │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ f64 ┆ f64 ┆ f64 │ ╞═══════╪═══════╪══════════╪════════════╪════════════════╡ │ 4 ┆ A ┆ 4.0 ┆ 0.0 ┆ null │ │ 6 ┆ A ┆ 5.0 ┆ 1.0 ┆ 1.41421356 │ │ 8 ┆ B ┆ 8.0 ┆ 0.0 ┆ null │ │ 11 ┆ A ┆ 7.0 ┆ 3.05505046 ┆ 3.60555128 │ │ 5 ┆ B ┆ 6.5 ┆ 1.5 ┆ 2.12132034 │ │ 6 ┆ A ┆ 6.75 ┆ 2.75378527 ┆ 3.10912635 │ │ 8 ┆ B ┆ 7.0 ┆ 1.52752523 ┆ 1.73205081 │ │ 15 ┆ B ┆ 9.0 ┆ 3.87298335 ┆ 4.30116263 │ └───────┴───────┴──────────┴────────────┴──────────────┘
注:当分组内只有1个元素时,样本标准差(ddof=1)会返回null,因为分母为0,这是合理的数学结果。
优势说明
- 内置函数经过Polars官方优化,计算效率更高
- 避免手动计算累积求和、计数、方差展开等步骤,减少出错概率
- 代码可读性更强,语义清晰
内容的提问来源于stack exchange,提问作者Phil-ZXX
相关产品推荐
相关产品推荐

