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

Polars基于指定列子集删除重复行并保留首次出现行的实现方法

Polars基于指定列子集删除重复行并保留首次出现行的实现方法

我明白你遇到的问题了——在Pandas里我们可以轻松用df.duplicated(subset=['col1','col2'], keep='first')来筛选掉重复行并保留第一次出现的记录,但Polars的is_duplicated()默认会把所有重复的行(包括首次出现的那一行)都标记为重复,确实和Pandas的逻辑不太一样。

下面给你两种实用的解决方法,都能完美实现你要的效果:

方法一:直接使用unique()方法(最简洁)

Polars专门提供了unique()方法,直接指定要去重的列子集和保留规则就能一步到位:

import polars as pl

data = {
    'col1': [1, 2, 3, 1, 1],
    'col2': [7, 8, 9, 7, 7],
    'col3': [3, 4, 5, 6, 8]
}

tmp = pl.DataFrame(data)
# 基于col1和col2去重,保留首次出现的行
result = tmp.unique(subset=['col1', 'col2'], keep='first')
print(result)

执行后得到的结果完全符合你的预期:

┌──────┬──────┬──────┐
│ col1 ┆ col2 ┆ col3 │
│ ---  ┆ ---  ┆ ---  │
│ i64  ┆ i64  ┆ i64  │
╞══════╪══════╪══════╡
│ 1    ┆ 7    ┆ 3    │
│ 2    ┆ 8    ┆ 4    │
│ 3    ┆ 9    ┆ 5    │
└──────┴──────┴──────┘

方法二:用窗口函数is_first()实现(贴近Pandas思路)

如果你更习惯先标记再筛选的思路,可以用Polars的is_first()窗口函数,它会为每组重复的col1+col2标记出第一行:

result = tmp.filter(
    pl.col(['col1', 'col2']).is_first()
)

这种方式的结果和unique()方法完全一致,逻辑上更接近你熟悉的Pandas用法——先识别出首次出现的行,再过滤保留。

简单总结下:Polars的is_duplicated()是标记所有重复行,而is_first()(对应还有is_last())则是专门用来标记组内首次/末次出现的行,刚好匹配你需要的保留首行的场景。

备注:内容来源于stack exchange,提问作者gebbissimo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 11:14:35