迭代 Polars Rust 行

rho*_*bro 7 dataframe rust rust-polars

我正在尝试迭代 Polars rust 数据帧的每一行。

在这一努力中,我发现df.get但文档说这很慢。然后我尝试过df.column("col").get,但这似乎会带来类似的问题。

处理数据帧每一行的正确方法是什么?我需要将其上传到数据库并将其转换为结构。

rit*_*e46 11

如果您rows在极坐标中激活该功能,您可以尝试:

DataFrame::get_rowDataFrame::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)