rust 如何使用polars::prelude::fold_exprs来累积列中的行?

l7wslrjt  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(143)

this handbook中,是一个如何利用函数polars::prelude::fold_exprs来累积多列水平的行值的示例。

let df = df!(
    "a" => &[1, 2, 3],
    "b" => &[10, 20, 30],
)?;

let out = df
    .lazy()
    .select([fold_exprs(lit(0), |acc, x| Ok(Some(acc + x)), [col("*")]).alias("sum")])
    .collect()?;
println!("{}", out);

输出为:

shape: (3, 1)
┌─────┐
│ sum │
│ --- │
│ i64 │
╞═════╡
│ 11  │
│ 22  │
│ 33  │
└─────┘

**问题:**如何使用fold_exprs函数将单列col(b)垂直的行值累加,得到以下输出:

shape: (3, 1)
┌─────┐
│ sum │
│ --- │
│ i64 │
╞═════╡
│ 10  │
│ 30  │
│ 60  │
└─────┘

我正在寻找类似的东西:

let out = df
    .lazy()
    .select([fold_exprs(lit(0), |acc, x| Ok(Some(acc + x)), [col("b")]).alias("sum")])
    .collect()?;

在这里,我将col("*")替换为col("b"):如何修改闭包|acc, x| Ok(Some(acc + x))以获得所需的输出?

xriantvc

xriantvc1#

对于累计和,您可以只使用cumsum(reverse: bool)函数(需要特性cum_agg)。

let df = df!(
    "a" => &[1, 2, 3],
    "b" => &[10, 20, 30],
)
.unwrap()
.lazy()
.with_column(col("b").cumsum(false).alias("b_summed"));

println!("{:?}", df.collect()?);
shape: (3, 3)
┌─────┬─────┬──────────┐
│ a   ┆ b   ┆ b_cumsum │
│ --- ┆ --- ┆ ---      │
│ i32 ┆ i32 ┆ i32      │
╞═════╪═════╪══════════╡
│ 1   ┆ 10  ┆ 10       │
│ 2   ┆ 20  ┆ 30       │
│ 3   ┆ 30  ┆ 60       │
└─────┴─────┴──────────┘

对于任意累积函数,您可以下拉到map

let df = df!(
    "a" => &[1, 2, 3],
    "b" => &[10, 20, 30],
)
.unwrap()
.lazy()
.with_column(
    col("b")
        .map(
            |b| {
                let b = b.i32()?;
                Ok(Some(
                    b.into_iter()
                        .scan(("".to_owned(), true), |(s, is_first), x| {
                            if !*is_first {
                                s.push(',');
                            }
                            *is_first = false;

                            s.push_str(x.map(|x| x.to_string()).as_deref().unwrap_or(""));
                            Some(s.clone())
                        })
                        .collect::<Utf8Chunked>()
                        .into_series(),
                ))
            },
            GetOutput::from_type(DataType::Utf8),
        )
        .alias("b_cumstr"),
);

println!("{:?}", df.collect()?);
shape: (3, 3)
┌─────┬─────┬──────────┐
│ a   ┆ b   ┆ b_cumstr │
│ --- ┆ --- ┆ ---      │
│ i32 ┆ i32 ┆ str      │
╞═════╪═════╪══════════╡
│ 1   ┆ 10  ┆ 10       │
│ 2   ┆ 20  ┆ 10,20    │
│ 3   ┆ 30  ┆ 10,20,30 │
└─────┴─────┴──────────┘

相关问题