如何应用封闭生 rust 的两极过滤器?

vyu0f0g1  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(156)

我正在rust中处理带有极性的数据。我需要过滤掉一些依赖于前一行或其他列中项目的值。我已经阅读了文档,但他们似乎使用内部方法来过滤每个单个值,如gt()is_not_null()等。以下是我的需求:
1.筛选列中的非单调递增值
1.根据同一行中的其他值筛选值。
1.根据当前行中一些值修改行中的一些值。
我想我在过滤的时候必须使用闭包来生成一个布尔值,但是我在文档中找不到合适的函数。所以我想知道如何使用闭包来过滤?有没有其他的方法可以满足我的需要?谢谢。

jv4diomz

jv4diomz1#

我只会回答'1.',因为'2.'没有意义,'3.'是一个不相关的问题。你可以通过创建一个屏蔽序列单调过滤:

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

fn main() {
    let f = df!{
        "a" => [  1,   2,   2,   3,   4,   3],
        "b" => ["a", "a", "b", "a", "c", "d"],
        "c" => [  5,   4,   3,   2,   1,   0],
    }.unwrap();
    let mut previous = i32::MIN;
    let filter_monoton = f["a"].i32().unwrap().into_iter().map(|x| {
        let ret = if x.unwrap() > previous { true } else { false };
        previous = x.unwrap();
        ret
    }).collect();
    let mono = f.filter(&filter_monoton).unwrap();
    dbg!(&f);
    dbg!(&mono);
}

将输出:

[src/main.rs:17] &f = shape: (6, 3)
┌─────┬─────┬─────┐
│ a   ┆ b   ┆ c   │
│ --- ┆ --- ┆ --- │
│ i32 ┆ str ┆ i32 │
╞═════╪═════╪═════╡
│ 1   ┆ a   ┆ 5   │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤
│ 2   ┆ a   ┆ 4   │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤
│ 2   ┆ b   ┆ 3   │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤
│ 3   ┆ a   ┆ 2   │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤
│ 4   ┆ c   ┆ 1   │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤
│ 3   ┆ d   ┆ 0   │
└─────┴─────┴─────┘
[src/main.rs:18] &mono = shape: (4, 3)
┌─────┬─────┬─────┐
│ a   ┆ b   ┆ c   │
│ --- ┆ --- ┆ --- │
│ i32 ┆ str ┆ i32 │
╞═════╪═════╪═════╡
│ 1   ┆ a   ┆ 5   │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤
│ 2   ┆ a   ┆ 4   │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤
│ 3   ┆ a   ┆ 2   │
├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤
│ 4   ┆ c   ┆ 1   │
└─────┴─────┴─────┘

相关问题