遍历行 polars rust

Iterate over rows polars rust

我正在尝试遍历 Polars Rust 数据框的每一行。

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

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

如果您在 polars 中激活 rows 功能,您可以尝试:

DataFrame::get_rowDataFrame::get_row_amortized.

后者是首选,因为它通过重用行缓冲区减少了堆分配。

Anti-pattern

这会很慢。从列式数据存储中请求行会导致许多缓存未命中,并且会经过多个间接层。

稍微好一点

使用 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
    }
}

如果您的 DataFrame 由单一数据类型组成,您应该将 Series 向下转换为 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
    }
}