You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust Pola-rs中按位置比较DataFrame并聚合统计?

Pola-rs中实现类似Pandas的df.where(df_1.ge(df_2)).sum().sum()逻辑

需求回顾

你已生成两个Pola-rs DataFrame(df_1和df_2),需要完成两个操作:

  1. 生成布尔DataFrame,每个元素表示df_1对应位置的值大于等于df_2;
  2. 统计该布尔DataFrame中true的总数量,对应Pandas里df.where(df_1.ge(df_2)).sum().sum()的效果。

惯用实现写法

在Pola-rs中可以通过简洁的步骤完成,完全贴合库的惯用风格:

1. 生成目标布尔DataFrame

直接对两个DataFrame调用ge方法(greater than or equal),即可逐元素比较生成布尔类型的DataFrame,完全匹配你需要的结果:

let bool_df = df_1.ge(&df_2).unwrap();

2. 统计true的总数量

Pola-rs对布尔列的求和会自动将true视为1、false视为0,因此可以直接调用sum_all方法一次性计算所有元素的总和,无需额外类型转换:

let total_true = bool_df.sum_all().unwrap().i32().unwrap();

如果需要分步求和(先按列统计true数量,再对列结果汇总),也可以写成:

let total_true = bool_df
    .sum() // 计算每列的true数量
    .unwrap()
    .sum::<i32>() // 对列求和结果做最终汇总
    .unwrap();

完整代码示例

将上述逻辑整合到你的原有代码中:

use polars::prelude::*;

fn main() {
    let df_1 = df! {
        "1" => [1,   2,   2,   3,   4,   3],
        "2" => [1,   4,   2,   3,   4,   3],
        "3" => [1,   2,   6,   3,   4,   3],
    }
    .unwrap();

    let mut df_2 = df_1.clone();
    for idx in 0..df_2.width() {
        df_2.apply_at_idx(idx, |s| {
            s.cummax(false)
                .shift(1)
                .fill_null(FillNullStrategy::Zero)
                .unwrap()
        })
        .unwrap();
    }

    // 生成布尔DataFrame
    let bool_df = df_1.ge(&df_2).unwrap();
    // 统计true总数
    let total_true = bool_df.sum_all().unwrap().i32().unwrap();

    println!("目标布尔DataFrame:\n{:#?}", bool_df);
    println!("符合条件的元素总数: {}", total_true);
}

输出验证

运行后会输出你预期的布尔DataFrame,以及示例中符合条件的元素总数(结果为10)。

内容的提问来源于stack exchange,提问作者baarkerlounger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:45:34