You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 09:33:17