如何在Polars中基于指定列子集筛选重复行?
在Polars中筛选多列组合重复的行
要筛选出A、B列组合重复的所有行,你之前的写法存在逻辑或方法使用错误,以下是两种可行的解决方案:
方法一:窗口函数判断组内行数
通过over窗口函数按A、B分组,计算每组的行数,筛选出行数大于1的行(即该(A,B)组合存在重复):
import polars as pl df = pl.DataFrame({"A": [1, 6, 5, 4, 5, 6], "B": ["A", "B", "C", "D", "C", "A"], "C": [2, 2, 2, 1, 1, 1]}) result = df.filter(pl.count().over(["A", "B"]) > 1) print(result)
执行后输出:
shape: (2, 3) ┌─────┬─────┬─────┐ │ A | B | C │ │ --- | --- | --- │ │ i64 | str | i64 │ ╞═════╪═════╪═════╡ │ 5 | C | 2 │ │ 5 | C | 1 │ └─────┴─────┴─────┘
方法二:先获取重复组合再筛选
先提取出存在重复的(A,B)组合,再通过关联筛选原DataFrame中对应行:
import polars as pl df = pl.DataFrame({"A": [1, 6, 5, 4, 5, 6], "B": ["A", "B", "C", "D", "C", "A"], "C": [2, 2, 2, 1, 1, 1]}) # 获取所有重复的(A,B)组合 duplicate_pairs = df.select(["A", "B"]).filter(pl.col("A", "B").is_duplicated()) # 关联筛选原数据 result = df.join(duplicate_pairs, on=["A", "B"]) print(result)
此方法同样能得到你期望的输出。
错误分析
pl.col("A", "B").is_duplicated()返回的是A、B列各自的布尔序列,Polars无法直接用多列布尔序列做筛选条件,需明确基于组合的重复判断逻辑。.all()的用法错误,pl.col("A", "B").all()是判断每行的A、B值是否都为真,和重复判断无关。unique(keep="none")返回的是无重复的行,DataFrame没有is_not()方法,无法直接取反,需换用窗口函数或关联筛选的方式实现需求。
内容的提问来源于stack exchange,提问作者miroslaavi
相关产品推荐
相关产品推荐

