如何在Rust中使用Polars读取CSV文件的指定列
如何在Rust中使用Polars读取CSV文件的指定列
嗨,这个问题我熟!在Rust里,想实现和Pandas read_csv指定列读取的功能,用Polars就可以搞定——它是Rust生态里最接近Pandas的数据分析库,对大文件的处理效率还特别友好。
首先你需要在项目的Cargo.toml里添加Polars的依赖,记得开启csv特性(用来处理CSV/TSV文件):
[dependencies] polars = { version = "0.35", features = ["csv", "lazy"] }
这里加lazy特性是为了支持懒加载模式,处理超大文件时会更高效。
接下来给你两种实现方式,完全对应你Python里的需求:
1. 立即加载模式(Eager API)
这种方式和Pandas的read_csv行为最像,直接加载指定列到内存:
use polars::prelude::*; fn main() -> Result<(), Box<dyn std::error::Error>> { // 完美对应你Python代码:pd.read_csv(file, sep='\t', header=None, usecols=[0,1,5]) let df = CsvReader::from_path("你的文件路径.tsv")? .with_separator(b'\t') // 指定制表符分隔,对应sep='\t' .with_header(None) // 表示文件没有表头,对应header=None .with_columns(Some(&[0, 1, 5])) // 只读取索引为0、1、5的列,对应usecols .finish()?; // 打印结果验证一下 println!("{}", df); Ok(()) }
2. 懒加载模式(Lazy API)
如果你的文件特别大,强烈推荐这种模式——它不会一次性把所有数据加载到内存,而是先构建查询计划,最后再执行,内存占用会低很多:
use polars::prelude::*; fn main() -> Result<(), Box<dyn std::error::Error>> { let df = LazyCsvReader::new("你的文件路径.tsv") .with_separator(b'\t') .with_header(None) .finish()? // 因为没有表头,Polars会自动给列命名为column_0、column_1...,这里选择对应索引的列 .select(&[col("column_0"), col("column_1"), col("column_5")]) .collect()?; println!("{}", df); Ok(()) }
额外小提示
如果你的文件本身有表头,你也可以直接通过列名来选择,比如把with_columns(Some(&[0,1,5]))换成with_columns(Some(&["姓名", "年龄", "地址"])),或者在懒加载模式里用select(&[col("姓名"), col("年龄")]),用法和Pandas一样灵活。
备注:内容来源于stack exchange,提问作者zwh82
相关产品推荐
相关产品推荐

