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

