如何在Rust Pola-rs中按位置比较DataFrame并聚合统计?
Pola-rs中实现类似Pandas的
df.where(df_1.ge(df_2)).sum().sum()逻辑 需求回顾
你已生成两个Pola-rs DataFrame(df_1和df_2),需要完成两个操作:
- 生成布尔DataFrame,每个元素表示
df_1对应位置的值大于等于df_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
相关产品推荐
相关产品推荐

