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

如何在Rust版Polars中创建含缺失值的DataFrame?

在Polars Rust Crate中创建带缺失值的DataFrame

一、修复并实现哨兵值替换方案

你原代码存在一个关键问题:Vec::with_capacity(10)仅预分配了内存空间,但向量内还没有实际元素,直接通过a_vec[i]赋值会触发panic。先修正这个问题,再实现哨兵值替换:

use polars::prelude::*;

fn main() {
    // 先初始化一个包含10个元素的向量(这里用0填充,后续覆盖)
    let mut a_vec: Vec<i64> = vec![0; 10];

    for i in 0..10 {
        if i % 2 == 0 { // 替换为你的实际判断条件
            a_vec[i] = 1;
        } else {
            a_vec[i] = std::i64::MAX;
        }
    }

    // 将向量转为Int64Chunked,再替换哨兵值为null
    let a_col = Int64Chunked::new("a", &a_vec)
        .replace(&std::i64::MAX, None)
        .unwrap();

    let df = DataFrame::new(vec![a_col]).unwrap();
    println!("{}", df);
}

Polars的ChunkedArray系列类型(比如Int64Chunked)提供了replace方法,传入哨兵值和None即可将目标值替换为缺失值。

二、无需哨兵值的最优方案

直接创建Vec<Option<i64>>类型的向量,跳过哨兵值环节,直接生成带缺失值的列,这是最贴合Polars Rust API设计的方式:

use polars::prelude::*;

fn main() {
    let a_vec: Vec<Option<i64>> = (0..10)
        .map(|i| if i % 2 == 0 { Some(1) } else { None }) // 符合条件存数值,否则存None
        .collect();

    // 用df!宏直接生成DataFrame
    let df = df!("a" => a_vec).unwrap();
    println!("{}", df);
}

也可以手动构建列再组装DataFrame:

use polars::prelude::*;

fn main() {
    let mut a_vec: Vec<Option<i64>> = Vec::with_capacity(10);
    for i in 0..10 {
        a_vec.push(if i % 2 == 0 { Some(1) } else { None });
    }

    let a_col = Int64Chunked::from_iter_options("a", a_vec.into_iter());
    let df = DataFrame::new(vec![a_col]).unwrap();
    println!("{}", df);
}

from_iter_options方法会自动将None解析为Polars的缺失值,无需额外转换步骤,效率和可读性都更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:40:02