如何在Rust Polars中不破坏DataFrame的前提下计算表达式?
在Rust Polars中不修改原有Eager DataFrame的前提下计算表达式
Polars的Eager API本身就是不可变设计,所有操作都会返回新的DataFrame/Series对象,不会修改原始数据。完全不需要转成LazyFrame或者调用Python,直接用原生Rust代码就能实现需求。
方法1:生成包含计算结果的新DataFrame
如果你需要保留原始DataFrame,同时得到包含计算列的新DataFrame,可以用with_column或select方法:
use polars::prelude::*; fn main() -> Result<()> { // 构造原始Eager DataFrame let df = df!( "a" => [1, 2, 3], "b" => [4, 5, 6], "c" => [2, 3, 4] )?; // 定义目标表达式 let expr = (sum(col("a") + col("b")) * col("c")).alias("result"); // 生成新的DataFrame,原始df完全不受影响 let new_df = df.with_column(expr)?; // 验证原始数据未被修改 println!("原始DataFrame:\n{}", df); println!("包含计算结果的新DataFrame:\n{}", new_df); Ok(()) }
方法2:直接提取计算结果(不生成新DataFrame)
如果只需要表达式的计算结果(比如作为独立Series),可以直接用select提取:
// 直接获取计算结果的Series let result_series = df.select(&[expr])?; // 按需转为Rust原生类型,比如Vec let result_values: Vec<i64> = result_series.column("result")?.i64()?.into_iter().collect();
关键说明
- Polars的Eager API中,所有DataFrame/Series都是不可变的,任何操作都会返回新对象,原始数据始终保持原样。
- 你提到的表达式
sum(col('a') + col('b')) * col('c')完全可以在Rust Eager模式下直接执行,无需依赖Python跨语言调用,性能更优。
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

