如何基于单列对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
相关产品推荐
相关产品推荐

