在Rust中使用Polars按名称筛选行并计算平均年龄
正确实现方案
代码示例
use polars::prelude::*; fn main() -> Result<(), Box<dyn std::error::Error>> { // 构建示例DataFrame let df = df!( "name" => ["panda", "polarbear", "seahorse"], "age" => [5, 7, 1] )?; let target_names = vec!["panda", "seahorse"]; let average_age = df.lazy() // 筛选出name在目标列表中的行 .filter(col("name").is_in(target_names)) // 计算筛选后age列的平均值 .agg([col("age").mean()]) // 执行延迟计算,获取结果 .collect()?; println!("平均年龄:{}", average_age); Ok(()) }
关键说明
- 筛选行而非列元素:你之前在
select中调用filter是对列内元素做过滤,而非筛选整行。正确的做法是使用.filter()方法直接对DataFrame的行进行筛选,传入一个布尔类型的Expr来判断行是否符合条件。 - 使用Expr API构建条件:Polars的延迟API(lazy)不支持直接传递Rust闭包作为过滤条件,必须用Expr组合出查询逻辑。这里
col("name").is_in(target_names)会生成一个布尔Expr,自动检查每行的name是否在目标向量中。 - 触发延迟计算:延迟API的操作只是构建查询计划,必须调用
.collect()才能实际执行计算并得到结果。
内容的提问来源于stack exchange,提问作者xosxos
相关产品推荐
相关产品推荐

