遍历行 polars rust
Iterate over rows polars rust
我正在尝试遍历 Polars Rust 数据框的每一行。
在这一努力中,我找到了 df.get
,但文档说这很慢。然后我尝试了 df.column("col").get
但这似乎会带来类似的问题。
处理数据框每一行的正确方法是什么?我需要将它上传到数据库并将其转换为结构。
如果您在 polars 中激活 rows
功能,您可以尝试:
DataFrame::get_row
和 DataFrame::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
}
}
我正在尝试遍历 Polars Rust 数据框的每一行。
在这一努力中,我找到了 df.get
,但文档说这很慢。然后我尝试了 df.column("col").get
但这似乎会带来类似的问题。
处理数据框每一行的正确方法是什么?我需要将它上传到数据库并将其转换为结构。
如果您在 polars 中激活 rows
功能,您可以尝试:
DataFrame::get_row
和 DataFrame::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
}
}