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

如何在Polars DataFrame中获取列元素并替换至其他位置

Polars Rust 入门:访问与修改DataFrame特定位置值

1. 访问DataFrame特定位置的值

Polars优先推荐向量化操作,但如果需要提取单个值,可以通过过滤定位行后,从结果中提取具体数值。以你的需求为例,获取TSLA的STRIKES值:

// 提取TSLA的STRIKES值
let tsla_strike: i32 = df
    .lazy()
    .filter(col("STOCK") == lit("TSLA"))
    .select(col("STRIKES"))
    .first()
    .collect()
    .unwrap()
    .column("STRIKES")
    .unwrap()
    .i32()
    .unwrap()
    .get(0)
    .unwrap()
    .clone();

步骤说明:

  • 用filter定位目标行,select只保留需要的列
  • first()取第一行,collect()执行计算得到小DataFrame
  • 通过column获取对应列,转换为i32类型后用get(0)提取具体值

2. 覆盖DataFrame特定位置的值

Polars中DataFrame是不可变结构,修改需要生成新的DataFrame。推荐用when/then/otherwise条件表达式实现向量化修改,避免逐行遍历(这是Polars的反模式)。

修正后的完整代码

use polars::prelude::*;

fn main() {
    let df = df! [
        "STOCK" => ["TSLA", "META", "AA"],
        "STRIKES" => [10, 20, 5],
    ]
    .unwrap();

    println!("原始df:\n{}", df);

    // 提取TSLA的STRIKES值
    let tsla_strike: i32 = df
        .lazy()
        .filter(col("STOCK") == lit("TSLA"))
        .select(col("STRIKES"))
        .first()
        .collect()
        .unwrap()
        .column("STRIKES")
        .unwrap()
        .i32()
        .unwrap()
        .get(0)
        .unwrap()
        .clone();

    // 修改AA的STRIKES值为tsla_strike
    let modified_df = df
        .lazy()
        .with_column(
            when(col("STOCK") == lit("AA"))
                .then(lit(tsla_strike))
                .otherwise(col("STRIKES"))
                .alias("STRIKES")
        )
        .collect()
        .unwrap();

    println!("\n修改后df:\n{}", modified_df);
}

代码说明

  • when/then/otherwise:当STOCK等于"AA"时,将STRIKES替换为tsla_strike,否则保留原数值
  • alias("STRIKES")确保新列名和原列一致,实现对原列的"覆盖"(实际是生成新列替换原列)
  • 这种向量化操作的性能远高于逐行遍历修改

运行结果

原始df:
shape: (3, 2)
┌───────┬─────────┐
│ STOCK ┆ STRIKES │
│ ---   ┆ ---     │
│ str   ┆ i32     │
╞═══════╪═════════╡
│ TSLA  ┆ 10      │
├╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤
│ META  ┆ 20      │
├╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤
│ AA    ┆ 5       │
└───────┴─────────┘

修改后df:
shape: (3, 2)
┌───────┬─────────┐
│ STOCK ┆ STRIKES │
│ ---   ┆ ---     │
│ str   ┆ i32     │
╞═══════╪═════════╡
│ TSLA  ┆ 10      │
├╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤
│ META  ┆ 20      │
├╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤
│ AA    ┆ 10      │
└───────┴─────────┘

注意事项

遍历DataFrame并逐行构建新DataFrame是Polars中的反模式。Polars的核心优势是向量化计算,逐行操作会完全丧失性能优势,所有修改、过滤、转换都应优先使用内置的向量化API实现。

内容的提问来源于stack exchange,提问作者Robert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:25:17