在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为:
| Product | Price |
|---|---|
| A | 10 |
| A | 10 |
| A | 20 |
| A | 20 |
| A | 10 |
| B | 5 |
| B | 10 |
| B | 10 |
运行代码后得到的Distinct_Running_Count列结果为:[1, 1, 2, 2, 3, 1, 2, 2],完全符合预期逻辑。
内容的提问来源于stack exchange,提问作者Anubhav Dikshit
相关产品推荐
相关产品推荐

