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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:03:21