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

如何在Polars中基于多列筛选重复数据?版本更新后原方法失效

解决Polars新版本中多列重复数据筛选报错问题

Polars更新后,原有的多列重复筛选写法会触发错误,原因是新版本对filter()的谓词要求更严格:必须传入单个布尔表达式,而pl.col(['A','C']).is_duplicated()会返回多个布尔列(对应每一列的重复判断结果),不符合要求。以下是两种正确的实现方式:

方法1:通过结构体判断多列组合重复

将需要判断重复的列打包成结构体,再调用is_duplicated(),这样会返回单个布尔列,直接满足filter()的要求:

df.filter(pl.struct(['A', 'C']).is_duplicated())

方法2:使用all_horizontal合并多列重复结果(适用于需每列单独重复的场景)

如果你的需求是筛选每一列各自都重复的行(而非多列组合重复),可以用all_horizontal将多列的布尔结果合并为单个布尔列:

df.filter(pl.all_horizontal(pl.col(['A', 'C']).is_duplicated()))

完整示例代码

import polars as pl

df = pl.DataFrame(
    {
        "A": [1,4,4,7,7,10,10,13,16],
        "B": [2,5,5,8,18,11,11,14,17],
        "C": [3,6,6,9,9,12,12,15,18]        
    }
)

# 筛选A、C列组合重复的行
result = df.filter(pl.struct(['A', 'C']).is_duplicated())
print(result)

输出结果

shape: (6, 3)
┌─────┬─────┬─────┐
│ A   ┆ B   ┆ C   │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 4   ┆ 5   ┆ 6   │
│ 4   ┆ 5   ┆ 6   │
│ 7   ┆ 8   ┆ 9   │
│ 7   ┆ 18  ┆ 9   │
│ 10  ┆ 11  ┆ 12  │
│ 10  ┆ 11  ┆ 12  │
└─────┴─────┴─────┘

错误原因说明

  • 第一种尝试df.filter(pl.col(['A','C']).is_duplicated()):新版本中is_duplicated()作用于多列会返回多个布尔表达式,filter()无法接受多列谓词,触发ComputeError。
  • 第二种尝试df.filter(df.select(...)):filter()仅接受布尔表达式,传入DataFrame类型的参数会触发TypeError。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:03:25