如何在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
相关产品推荐
相关产品推荐

