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

如何基于单列对Polars DataFrame去除重复行?

基于单列保留Polars DataFrame唯一值的解决方案

需求

需基于col_float列对Polars DataFrame去重,保留每个唯一值第一次出现的完整行,删除后续重复行。

处理前的DataFrame

┬───────────┬──────────┬────────────┬────────────┐
┆ col_float ┆ col_bool ┆ col_str    ┆ col_date   │
┆ ---       ┆ ---      ┆ ---        ┆ ---        │
┆ f64       ┆ bool     ┆ str        ┆ date       │
╪═══════════╪══════════╪════════════╪════════════╡
┆ 10.0      ┆ true     ┆ 2020-01-01 ┆ 2020-01-01 │
┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
┆ 20.0      ┆ false    ┆ 2020-01-01 ┆ 2020-01-01 │
┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
┆ 20.0      ┆ true     ┆ 2020-01-01 ┆ 2020-01-01 │
┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
┆ 40.0      ┆ false    ┆ 2020-01-01 ┆ 2020-01-01 │
┴───────────┴──────────┴────────────┴────────────┘

处理后的DataFrame

┬───────────┬──────────┬────────────┬────────────┐
┆ col_float ┆ col_bool ┆ col_str    ┆ col_date   │
┆ ---       ┆ ---      ┆ ---        ┆ ---        │
┆ f64       ┆ bool     ┆ str        ┆ date       │
╪═══════════╪══════════╪════════════╪════════════╡
┆ 10.0      ┆ true     ┆ 2020-01-01 ┆ 2020-01-01 │
┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
┆ 20.0      ┆ false    ┆ 2020-01-01 ┆ 2020-01-01 │
┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
┆ 40.0      ┆ false    ┆ 2020-01-01 ┆ 2020-01-01 │
┴───────────┴──────────┴────────────┴────────────┘

错误尝试及问题

你之前的代码错误地传递了DataFrame给unique方法,导致类型不匹配:

let mut df = pl::DataFrame(
    {
        "col_float": [10.0, 20.0, 20.0, 40.0],
        "col_bool": [true, false, true, false],
        "col_str": pl::repeat("2020-01-01", 4, true),
    }
);
let mut df2 = pl::DataFrame::new(vec![&df[0]]).unwrap();

df = df.unique(df2, pl::UniqueKeepStrategy::First);

错误信息:

expected `Option<&[String]>`, found `DataFrame`

问题核心:unique方法的第一个参数需要列名切片(或None表示基于全列去重),而非DataFrame。

正确实现方法

直接传递目标列名切片给unique方法即可,完整代码如下:

use polars::{prelude::*, df};
use chrono::NaiveDate;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建原始DataFrame
    let mut df = df!(
        "col_float" => [10.0, 20.0, 20.0, 40.0],
        "col_bool" => [true, false, true, false],
        "col_str" => ["2020-01-01", "2020-01-01", "2020-01-01", "2020-01-01"],
        "col_date" => [NaiveDate::from_ymd_opt(2020, 1, 1).unwrap(); 4]
    )?;

    // 基于col_float列去重,保留首次出现的行
    df = df.unique(Some(&["col_float"]), UniqueKeepStrategy::First)?;

    println!("{}", df);
    Ok(())
}

关键说明

  • Some(&["col_float"])指定仅基于该列判断重复
  • UniqueKeepStrategy::First确保保留每个唯一值的第一行记录
  • 使用df!宏简化DataFrame创建,补充了col_date列的完整初始化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:18:16