基于Signal触发的Cumulative Sum计算方法咨询
基于Signal触发的多组累积求和计算
需求:跟踪Value列的累积和,每次当Signal列取值为1时启动新的累积计算,生成对应组数的累积和列,均计算至最后一行(Index=11)。
原始数据:
| Index | Value | Signal |
|---|---|---|
| 0 | 3 | 0 |
| 1 | 8 | 0 |
| 2 | 8 | 0 |
| 3 | 7 | 1 |
| 4 | 9 | 0 |
| 5 | 10 | 0 |
| 6 | 14 | 1 |
| 7 | 10 | 0 |
| 8 | 10 | 0 |
| 9 | 4 | 1 |
| 10 | 10 | 0 |
| 11 | 10 | 0 |
预期输出:
| Index | Value | Signal | Cumsum_1 | Cumsum_2 | Cumsum_3 |
|---|---|---|---|---|---|
| 0 | 3 | 0 | 0 | 0 | 0 |
| 1 | 8 | 0 | 0 | 0 | 0 |
| 2 | 8 | 0 | 0 | 0 | 0 |
| 3 | 7 | 1 | 7 | 0 | 0 |
| 4 | 9 | 0 | 16 | 0 | 0 |
| 5 | 10 | 0 | 26 | 0 | 0 |
| 6 | 14 | 1 | 40 | 14 | 0 |
| 7 | 10 | 0 | 50 | 24 | 0 |
| 8 | 10 | 0 | 60 | 34 | 0 |
| 9 | 4 | 1 | 64 | 38 | 4 |
| 10 | 10 | 0 | 74 | 48 | 14 |
| 11 | 10 | 0 | 84 | 58 | 24 |
解决方案(Pandas实现)
思路
- 先定位
Signal列值为1的所有行索引,这些是每组累积和的起始点 - 对每个起始索引,从该位置开始计算
Value的累积和,起始位置前的行填充0
完整代码示例
import pandas as pd # 构造原始数据 data = { 'Index': [0,1,2,3,4,5,6,7,8,9,10,11], 'Value': [3,8,8,7,9,10,14,10,10,4,10,10], 'Signal': [0,0,0,1,0,0,1,0,0,1,0,0] } df = pd.DataFrame(data).set_index('Index') # 获取所有Signal=1的起始索引 start_indices = df[df['Signal'] == 1].index.tolist() # 生成每组累积和列 for i, start_idx in enumerate(start_indices, 1): col_name = f'Cumsum_{i}' # 初始化全0列 df[col_name] = 0 # 从起始索引开始计算累积和并赋值 df.loc[start_idx:, col_name] = df.loc[start_idx:, 'Value'].cumsum() # 输出结果 print(df.reset_index())
代码说明
start_indices = df[df['Signal'] == 1].index.tolist():提取所有触发累积计算的起始索引,此处得到[3,6,9]- 循环中先创建对应名称的新列并填充0,再对起始索引之后的行计算
Value的累积和,覆盖新列的对应位置 - 最终得到的DataFrame完全匹配预期输出格式
内容的提问来源于stack exchange,提问作者arkon
相关产品推荐
相关产品推荐

