如何在Rust的Polars v0.46.0 DataFrame中添加列均值行?
在Polars v0.46.0中追加数值列均值行的实现方案
核心思路
Polars v0.46.0中mean_as_series方法已被移除,直接调用Column::mean会触发 trait 约束错误——该方法要求列满足Ord等额外约束,并非通用场景的最优解。新版本更推荐通过Series 方法或表达式API完成统计计算,再用vstack将均值行追加到原DataFrame。
简洁实现代码
use polars::prelude::*; fn main() { let df: DataFrame = df! [ "a" => &["a", "b", "c"], "b" => &[1, 2, 3], "c" => &["d", "e", "f"], "d" => &[4, 5, 6], ].unwrap(); // 构造均值行:数值列取均值,非数值列填充"avg" let avg_row = df.select( pl.col("*").map(|s| { if s.dtype().is_numeric() { // 对数值列计算均值并保持类型兼容 s.mean().unwrap() } else { // 非数值列填充"avg",并转换为原列类型 pl.lit("avg").cast(s.dtype()).unwrap() } }) ).unwrap(); // 将均值行追加到原DataFrame let result_df = df.vstack(&avg_row).unwrap(); println!("{}", result_df); }
输出结果
┌─────┬─────┬─────┬─────┐ │ a ┆ b ┆ c ┆ d │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ f64 ┆ str ┆ f64 │ ╞═════╪═════╪═════╪═════╡ │ a ┆ 1.0 ┆ d ┆ 4.0 │ │ b ┆ 2.0 ┆ e ┆ 5.0 │ │ c ┆ 3.0 ┆ f ┆ 6.0 │ │ avg ┆ 2.0 ┆ avg ┆ 5.0 │ └─────┴─────┴─────┴─────┘
自定义非数值列显示
如果需要非数值列显示null而非avg,修改非数值列的处理逻辑即可:
pl.col("*").map(|s| { if s.dtype().is_numeric() { s.mean().unwrap() } else { pl.lit(None).cast(s.dtype()).unwrap() } })
内容的提问来源于stack exchange,提问作者Fedii
相关产品推荐
相关产品推荐

