rust 如何通过验证列的值是否包含在向量中来过滤polars DataFrame?

nue99wik  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(126)

我有一个 Dataframe ,其中列“ID”的数据类型为UInt 32,我有一个名为ids的向量。我想返回一个 Dataframe ,其中的行“ID”值包含在向量id中。

所需最小示例

use polars::df;
use polars::prelude::*;

fn filter_by_id(table: &DataFrame, ids: Vec<u32>) -> DataFrame {
    df!{
        "ID" => &[1, 3, 5],
        "VALUE" => &["B", "D", "F"]
    }.unwrap()
}

fn main() {
    let table = df!{
        "ID" => &[0, 1, 2, 3, 4, 5],
        "VALUE" => &["A", "B", "C", "D", "E", "F"]
    }.unwrap();
    let ids = vec![1, 3, 5];
    let filtered_table = filter_by_id(&table, ids);
    println!("{:?}", table);
    println!("{:?}", filtered_table);
}

| 识别号|价值|
| - ------|- ------|
| 无|A类|
| 1个|B|
| 第二章|C级|
| 三个|D级|
| 四个|E级|
| 五个|F级|
滤波器向量= [1,3,5]
所需输出=
| 识别号|价值|
| - ------|- ------|
| 1个|B|
| 三个|D级|
| 五个|F级|

vuktfyat

vuktfyat1#

polars大多运行在SeriesExpr类型上,所以通过将vec转换为Series,可以相对容易地完成这项任务。

use polars::df;
use polars::prelude::*;

fn main () {
    let table = df!{
        "ID" => &[0, 1, 2, 3, 4, 5],
        "VALUE" => &["A", "B", "C", "D", "E", "F"]
    }.unwrap();
    let ids = vec![1, 3, 5];
    // convert the vec to `Series`
    let ids_series = Series::new("ID", ids);
    // create a filter expression
    let filter_expr = col("ID").is_in(lit(ids_series));
    // filter the dataframe on the expression
    let filtered = table.lazy().filter(filter_expr).collect().unwrap();
    println!("{:?}", filtered);
}

注意:您需要添加lazyis_in功能
cargo add polars --features lazy,is_in

相关问题