在Rust中使用polars过滤- Eagerly

3phpmpom  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(260)

我试着用rust中的polars做一个简单的过滤器:

let mask = df.column("AISLE_ID").unwrap().eq(lit(1));
let filtered_df = df.filter(&mask).unwrap();

但它根本不起作用:预期&ChunkedArray<...>,找到&bool
我可以用lazy的方式来做,但我不想克隆 Dataframe

let dfe = df.clone();
    let filtered_df = dfe.lazy().filter(
        col("AISLE_ID").eq(lit(1))
    )
    .collect();

你能帮我吗?

c86crjj0

c86crjj01#

正如其他人提到的,无论何时执行filter,无论是否是惰性的,都会在创建新的DataFrame时执行数据的副本。不同之处在于何时执行复制(如果在惰性DataFrame的范围内发生多个转换,则会进行优化)。
在最初的懒惰示例中,初始let def = df.copy()是不必要的。下面的代码按预期编译和工作:

use polars::prelude::*;

fn main() {
    let s0 = Series::new("AISLE_ID", [0, 1, 2].as_ref());
    let s1 = Series::new("temp", [22.1, 19.9, 7.].as_ref());
    let df = DataFrame::new(vec![s0, s1]).unwrap();
    let filtered_df = df.lazy().filter(
        col("AISLE_ID").eq(lit(1))
    )
    .collect();

    println!("{:?}", filtered_df)
}

退货:

Ok(shape: (1, 2)
┌──────────┬──────┐
│ AISLE_ID ┆ temp │
│ ---      ┆ ---  │
│ i32      ┆ f64  │
╞══════════╪══════╡
│ 1        ┆ 19.9 │
└──────────┴──────┘)

Cargo.toml:

[dependencies]
polars = { version = "0.29.0", features = ["lazy"] }

相关问题