我正在尝试迭代 Polars rust 数据帧的每一行。
在这次努力中,我发现df.get
但文档说这很慢。然后我尝试过df.column("col").get
但这似乎也带来了类似的问题。
处理数据帧每一行的正确方法是什么?我需要将其上传到数据库并将其转换为结构。
如果您激活rows
极地功能,您可以尝试:
DataFrame::get_row
and 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
}
}
If your DataFrame
由单一数据类型组成,您应该向下转换Series
to 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
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)