当条件不满足时重置Pandas的cumsum累计求和
解决方案
你需要先在每个A-B分组内识别出连续相同C值的区块,再在每个区块内做累计计数,这样就能在C值变化时重置累计值。具体代码如下:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'A': ['group1']*6, 'B': ['group1_c']*6, 'C': [12,12,12,1,12,12] }) # 1. 分组内标记C值变化的位置 df['change_flag'] = df.groupby(['A','B'])['C'].apply(lambda x: x != x.shift()).astype(int) # 2. 分组内生成连续相同C值的区块ID df['block_id'] = df.groupby(['A','B'])['change_flag'].cumsum() # 3. 每个区块内计算累计值 df['cumul'] = df.groupby(['A','B','block_id']).cumcount() # 可选:删除中间辅助列 df = df.drop(['change_flag','block_id'], axis=1)
执行后得到的结果与你的期望一致:
| A | B | C | cumul |
|---|---|---|---|
| group1 | group1_c | 12 | 0 |
| group1 | group1_c | 12 | 1 |
| group1 | group1_c | 12 | 2 |
| group1 | group1_c | 1 | 0 |
| group1 | group1_c | 12 | 0 |
| group1 | group1_c | 12 | 1 |
代码说明
- 步骤1:通过
groupby(['A','B'])限定仅在同一分组内比较,x != x.shift()会将当前行与前一行C值不同的位置标记为True,转为整数后用1表示变化点、0表示无变化。 - 步骤2:对变化标记做分组内累加,每遇到一个变化点,区块ID就会递增,确保同一连续相同
C值的行归属同一个区块。 - 步骤3:
cumcount()会在每个A-B-区块ID的分组内从0开始计数,完美实现“连续匹配时累计,不匹配时重置为0”的需求。
内容的提问来源于stack exchange,提问作者python_interest
相关产品推荐
相关产品推荐

