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

在Pandas中按分组计算价格的滚动唯一计数

解决方案

你的需求核心是按产品分组后,追踪价格的连续变化,相同价格保持计数,每次价格变更则递增计数,之前的两种方法都没命中这个逻辑:

  • 第一种groupby(['Product', 'Price']).cumcount() + 1是对每个「产品+价格」组内的行进行序号计数,比如同一产品同价格的多行会生成1、2、3...,不符合“价格不变时计数为1”的要求。
  • 第二种groupby(['Product', 'Price']).transform('nunique')是计算每个组内的唯一值数量,结果全为1,完全无法体现价格变化的递增逻辑。

正确实现代码

可以通过「判断价格是否变化→组内累加变化次数→调整初始值」的步骤实现:

# 方法1:分步实现,清晰易懂
# 1. 按产品分组,标记当前行价格与上一行是否不同
df['_price_change_flag'] = df.groupby('Product')['Price'].diff().ne(0)
# 2. 对每个产品内的变化标记累加,再加1得到最终计数(初始变化标记为NaN,cumsum后为0,加1后初始计数为1)
df['Distinct_Running_Count'] = df.groupby('Product')['_price_change_flag'].cumsum() + 1
# 3. 可选:删除中间辅助列
df = df.drop('_price_change_flag', axis=1)

或者更简洁的单行写法:

# 方法2:单行实现,无需辅助列
df['Distinct_Running_Count'] = df.groupby('Product')['Price'].apply(
    lambda x: x.ne(x.shift()).cumsum()
) + 1

示例验证

假设你的输入DataFrame为:

ProductPrice
A10
A10
A20
A20
A10
B5
B10
B10

运行代码后得到的Distinct_Running_Count列结果为:[1, 1, 2, 2, 3, 1, 2, 2],完全符合预期逻辑。

内容的提问来源于stack exchange,提问作者Anubhav Dikshit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 11:30:51