在rust-polars中使用is_in根据另一个DataFrame筛选数据集的问题
在rust-polars中使用is_in根据另一个DataFrame筛选数据集的问题
看起来你想通过另一个DataFrame里的名称列表来筛选主DataFrame的行,我来帮你搞定这个问题!
先把你给出的代码补全(看起来最后部分有点截断):
use polars::prelude::*; fn main() { let mut df = df! [ "names" => ["a", "b", "c", "d"], "values" => [1, 2, 3, 4], "floats" => [1.25, 2., 1., 0.5] ].unwrap(); let df1 = df! [ "names" => ["b", "c"] ].unwrap(); }
要实现你的需求,核心是用Polars提供的is_in方法,它可以快速检查某列的值是否存在于指定的集合/Series中。具体步骤如下:
- 先从筛选用的DataFrame(df1)里提取出
names列作为Series - 用这个Series生成一个布尔掩码,标记主DataFrame中符合条件的行
- 最后用掩码筛选出目标数据
下面是完整的可运行代码:
use polars::prelude::*; fn main() { let mut df = df! [ "names" => ["a", "b", "c", "d"], "values" => [1, 2, 3, 4], "floats" => [1.25, 2., 1., 0.5] ].unwrap(); let df1 = df! [ "names" => ["b", "c"] ].unwrap(); // 提取筛选用的名称列 let filter_names = df1.column("names").unwrap(); // 生成布尔掩码:检查主DF的names列是否在筛选列表中 let mask = df.column("names").unwrap().is_in(filter_names).unwrap(); // 应用掩码筛选数据 let filtered_df = df.filter(&mask).unwrap(); println!("筛选后的数据集:\n{}", filtered_df); }
运行这段代码后,你会得到只包含names为"b"和"c"的行:
shape: (2, 3) ┌───────┬────────┬────────┐ │ names ┆ values ┆ floats │ │ --- ┆ --- ┆ --- │ │ str ┆ i32 ┆ f64 │ ╞═══════╪════════╪════════╡ │ b ┆ 2 ┆ 2.0 │ │ c ┆ 3 ┆ 1.0 │ └───────┴────────┴────────┘
如果你喜欢更简洁的链式写法,也可以用Lazy API来实现(大数据集下性能会更优):
let filtered_df = df .lazy() .filter(col("names").is_in(col("names").lit(df1.clone()))) .collect() .unwrap();
备注:内容来源于stack exchange,提问作者Roger V.
相关产品推荐
相关产品推荐

