Pandas按a列分组仅b列值变化时累计计数的最优实现方法
pandas实现同a分组下b变化时计数递增方案
实现代码
import pandas as pd # 原始数据生成 l = [["a", 12, 12], ["a", 12, 33.], ["b", 12.3, 12.3], ["a", 13, 1]] df = pd.DataFrame(l, columns=["a", "b", "c"]) # 核心逻辑:同a分组内b变化时计数递增 df['freq'] = df.groupby('a')['b'].apply(lambda x: (x != x.shift()).cumsum())
逻辑说明
- 先按
a列分组,所有判断和计数都在相同a值的分组内执行 - 用
x.shift()取分组内上一行的b值,和当前行b值比较,不相等时返回布尔值True(对应数值1),相等返回False(对应数值0) - 对比较结果做累计求和,b每变化一次计数+1,完全匹配需求
高性能优化版(适合处理百万级以上大数据)
避免apply带来的性能损耗,写法如下:
df['freq'] = (df['b'].ne(df.groupby('a')['b'].shift())).groupby(df['a']).cumsum()
最终输出效果
| a | b | c | freq |
|---|---|---|---|
| a | 12.0 | 12.0 | 1 |
| a | 12.0 | 33.0 | 1 |
| b | 12.3 | 12.3 | 1 |
| a | 13.0 | 1.0 | 2 |
内容的提问来源于stack exchange,提问作者CC_
相关产品推荐
相关产品推荐

