将Pandas df.duplicated功能转换为Polars等效实现
在Polars中实现类似Pandas的df.duplicated标记功能(保留所有行)
要在Polars中实现与Pandas df.duplicated(subset=..., keep='first') 等价的标记逻辑(首次出现行标记为1,其余重复行标记为0,且保留所有行),可以通过窗口函数分组计数的方式实现,核心思路是对指定列分组后,标记每组内的第一行。
步骤1:创建Polars DataFrame
先对应Pandas示例创建Polars数据集:
import polars as pl data = { 'store': ['A', 'A', 'B', 'B', 'C', 'C', 'A', 'B', 'C'], 'item': ['X', 'Y', 'X', 'Y', 'X', 'Y', 'X', 'Y', 'X'], 'date': ['2023-01-01', '2023-01-01', '2023-01-01', '2023-01-01', '2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-02'], 'Sold_Qty_LY': [10, 20, 15, 25, 30, 40, 10, 15, 20], } df = pl.DataFrame(data)
步骤2:实现标记逻辑
使用cumcount()窗口函数对指定分组列计数,每组内首次出现的行计数为0,通过when/then/otherwise将其转为1,其余行转为0:
# 指定需要判断重复的列 subset = ['store', 'item'] # 新增Total_SKU_Count列 df = df.with_columns( Total_SKU_Count=pl.when(pl.cumcount().over(subset) == 0).then(1).otherwise(0) )
验证不同subset的效果
- 当subset为['store', 'item', 'date']时
所有(store, item, date)组合均唯一,每组仅一行,cumcount()结果全为0,因此所有行的Total_SKU_Count均为1:
subset = ['store', 'item', 'date'] df = df.with_columns( Total_SKU_Count=pl.when(pl.cumcount().over(subset) == 0).then(1).otherwise(0) )
- 当subset为['store', 'item']时
重复的(store, item)组合中,首次出现的行标记为1,后续重复行标记为0,与Pandas示例的输出完全一致。
核心逻辑说明
pl.cumcount().over(subset):在指定的分组列范围内,对每行按出现顺序从0开始计数,首次出现的行计数为0。pl.when(...).then(1).otherwise(0):将计数为0的行标记为1(首次出现),其余行标记为0(重复行)。- 该方法全程保留所有原始行,仅新增标记列,完全符合需求。
内容的提问来源于stack exchange,提问作者Akshay
相关产品推荐
相关产品推荐

