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

Rust使用Polars的LazyCsvReader读取CSV报未声明类型错误

问题根因

Rust版Polars默认采用最小功能集发布,直接引入基础依赖不会包含CSV读写、懒计算、表达式相关接口,这就是LazyCsvReader、col等类型/函数未定义的核心原因,需要在引入依赖时手动开启对应功能开关。

正确依赖配置

修改项目根目录下的Cargo.toml,替换原有polars依赖配置为以下内容,开启所需功能:

[package]
name = "polar_test"
version = "0.1.0"
edition = "2021"

[dependencies]
polars = { version = "0.22.6", features = ["lazy", "csv", "io"] }

各功能开关说明:

  • lazy:开启懒计算全量API,包含LazyCsvReader、表达式函数(col/lit等)、分组/排序等链式操作接口
  • csv:开启CSV格式的读写能力
  • io:通用文件IO支撑,用于读写本地文件
可运行实现代码

代码逻辑与给出的pandas版本完全对齐:指定列名读取无表头的wine数据集、按Class label分组统计计数、结果导出为CSV文件、控制台打印统计结果。
首先在项目根目录手动创建datastore文件夹,将wget下载的wine.data放入该目录,之后替换src/main.rs内容为以下代码:

use polars::prelude::*;
use std::path::Path;

fn read_data(path: &Path) -> PolarsResult<DataFrame> {
    // 与pandas版本完全一致的列名定义
    let columns = vec![
        "Class label",
        "Alcohol",
        "Malic acid",
        "Ash",
        "Alcalinity of ash",
        "Magnesium",
        "Total phenols",
        "Flavanoids",
        "Nonflavanoid phenols",
        "Proanthocyanins",
        "Color intensity",
        "Hue",
        "OD280/OD315 of diluted wines",
        "Proline",
    ];

    // 读取无表头CSV,手动指定列名
    LazyCsvReader::new(path.to_str().unwrap())
        .has_header(false)
        .with_column_names(Some(columns))
        .finish()
        .collect()
}

fn count_classes(df: DataFrame) -> PolarsResult<DataFrame> {
    let stat_df = df
        .lazy()
        .groupby([col("Class label")])
        // 分组计数,结果列命名为total
        .agg([col("Class label").count().alias("total")])
        // 按类别排序保证输出顺序稳定
        .sort("Class label", SortOptions::default())
        .collect()?;

    // 导出统计结果到CSV,不包含行索引
    let mut out_file = std::fs::File::create(Path::new("datastore/data_count.csv"))?;
    CsvWriter::new(&mut out_file)
        .include_header(true)
        .finish(&mut stat_df.clone())?;

    Ok(stat_df)
}

fn main() -> PolarsResult<()> {
    let file_path = Path::new("datastore/wine.data");
    let main_df = read_data(file_path)?;
    let class_stat_df = count_classes(main_df)?;
    // 控制台打印统计结果
    println!("{}", class_stat_df);
    Ok(())
}
运行说明
  • 执行cargo run即可完成编译运行
  • 运行成功后控制台会输出三个类别的计数结果,同时datastore目录下会生成data_count.csv文件,与pandas版本输出完全一致
  • 注意0.22版本Polars的LazyCsvReader配置完读取参数后,需要先调用.finish()得到LazyFrame才能进行后续的数据处理操作,最后调用.collect()触发实际计算得到DataFrame,不能直接在新建读取器后调用collect。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:39:18