Python Pandas实现多条件触发重置的分列累积求和
多条件分列重置的累积求和实现
问题描述
现有如下结构的数据集:
| ref_cumsum | event_condition |
|---|---|
| 1 | None |
| 2 | None |
| 3 | None |
| None | condition1 |
| 2 | None |
| 4 | None |
| 6 | None |
| None | condition2 |
| 1 | None |
| 2 | None |
| 3 | None |
需要基于ref_cumsum列生成两个累积求和列:
cumsum1:仅在event_condition为condition1时重置,其余情况持续累积cumsum2:仅在event_condition为condition2时重置,其余情况持续累积
期望得到的结果如下:
| ref_cumsum | event_condition | cumsum1 | cumsum2 |
|---|---|---|---|
| 1 | None | 1 | 1 |
| 2 | None | 3 | 3 |
| 3 | None | 6 | 6 |
| 0 | condition1 | 0 | 6 |
| 2 | None | 2 | 8 |
| 4 | None | 6 | 12 |
| 6 | None | 12 | 18 |
| 0 | condition2 | 12 | 0 |
| 1 | None | 13 | 1 |
| 2 | None | 15 | 3 |
| 3 | None | 18 | 6 |
(注:原示例中ref_cumsum的None值在累积时按0处理)
解决方案
核心思路是为每个条件生成独立的分组标识,通过分组后计算累积和实现按需重置。具体代码如下:
import pandas as pd # 构造示例数据 reference_cumsum = [1,2,3,None,2,4,6,None,1,2,3] condition = [None,None,None,'condition1',None,None,None,'condition2',None,None,None] df = pd.DataFrame({'ref_cumsum': reference_cumsum, 'event_condition': condition}) # 将ref_cumsum中的None替换为0,避免累积求和空值问题 df['ref_cumsum'] = df['ref_cumsum'].fillna(0) # 生成cumsum1的分组键:每次触发condition1时分组号递增 df['group1'] = (df['event_condition'] == 'condition1').cumsum() # 生成cumsum2的分组键:每次触发condition2时分组号递增 df['group2'] = (df['event_condition'] == 'condition2').cumsum() # 按分组计算对应条件的累积求和 df['cumsum1'] = df.groupby('group1')['ref_cumsum'].cumsum() df['cumsum2'] = df.groupby('group2')['ref_cumsum'].cumsum() # 可选:删除临时分组列 df = df.drop(['group1', 'group2'], axis=1) print(df)
代码解释
- 数据预处理:把
ref_cumsum里的None替换成0,确保累积求和逻辑正常运行。 - 分组键生成:
group1:对event_condition == 'condition1'的结果做累积求和,每次触发condition1时分组号加1,这样后续累积会在新分组重新开始。group2:同理,针对condition2生成独立的分组标识,互不影响cumsum1的累积逻辑。
- 分组累积求和:用各自的分组键对
ref_cumsum执行cumsum,同一分组内持续累加,触发条件后进入新分组,重新计算累积和。
内容的提问来源于stack exchange,提问作者stat_man
相关产品推荐
相关产品推荐

