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

在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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:24:31