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

将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的效果

  1. 当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)
)
  1. 当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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:57:13