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
相关产品推荐
相关产品推荐

