rho*_*bro 7 dataframe rust rust-polars
我正在尝试迭代 Polars rust 数据帧的每一行。
在这一努力中,我发现df.get但文档说这很慢。然后我尝试过df.column("col").get,但这似乎会带来类似的问题。
处理数据帧每一行的正确方法是什么?我需要将其上传到数据库并将其转换为结构。
rit*_*e46 11
如果您rows在极坐标中激活该功能,您可以尝试:
DataFrame::get_row和DataFrame::get_row_amortized。
后者是首选,因为它通过重用行缓冲区来减少堆分配。
这会很慢。从列式数据存储中请求行将导致许多缓存未命中,并且会经过多个间接层。
稍微好一点的是使用 Rust 迭代器。这将比这些get_row方法具有更少的间接性。
df.as_single_chunk_par();
let mut iters = df.columns(["foo", "bar", "ham"])?
.iter().map(|s| s.iter()).collect::<Vec<_>>();
for row in 0..df.height() {
for iter in &mut iters {
let value = iter.next().expect("should have as many iterations as rows");
// process value
}
}
Run Code Online (Sandbox Code Playgroud)
如果您DataFrame由单一数据类型组成,您应该将 向下转换Series为 a ChunkedArray,这将加快迭代速度。
在下面的代码片段中,我们假设数据类型是Float64.
let mut iters = df.columns(["foo", "bar", "ham"])?
.iter().map(|s| Ok(s.f64()?.into_iter())).collect::<Result<Vec<_>>>()?;
for row in 0..df.height() {
for iter in &mut iters {
let value = iter.next().expect("should have as many iterations as rows");
// process value
}
}
Run Code Online (Sandbox Code Playgroud)