如何用Pandas高效计算连续1的累计和及块总计?
高效生成连续1的累计和与块总计(无循环实现)
针对包含N(行ID)和Indicator(取值0/1)的数据集,以下是无循环、高效生成Cumsum(仅连续1的累计和)和Total(每个连续1块的总计)的实现方案,基于Python的pandas库完成:
实现步骤与代码
1. 构造示例数据集
import pandas as pd # 模拟输入数据 df = pd.DataFrame({ 'N': range(1, 11), 'Indicator': [1,1,0,1,1,1,0,0,1,0] })
2. 标记连续1的独立块
通过判断Indicator的状态变化,为每个连续的1序列分配唯一分组ID,0行的分组ID设为0:
# 标记新块的起始位置:当前为1且前一行不为1 df['group'] = (df['Indicator'] == 1) & (df['Indicator'].shift(1) != 1) # 生成分组ID,0行保持为0 df['group'] = df['group'].cumsum() * df['Indicator']
3. 计算连续1的累计和(Cumsum)
在每个分组内对Indicator累计求和,同时确保0行的累计和为0:
df['Cumsum'] = df.groupby('group')['Indicator'].cumsum() * df['Indicator']
4. 计算每个连续块的总计(Total)
提取每个分组的累计和最大值(即块的长度),映射回原数据集,0行填充为0:
# 计算每个分组的累计和最大值 group_totals = df.groupby('group')['Cumsum'].max() # 映射到原数据并处理0行 df['Total'] = df['group'].map(group_totals).fillna(0).astype(int)
5. 最终结果
查看处理后的核心列:
print(df[['N', 'Indicator', 'Cumsum', 'Total']])
输出结果:
N Indicator Cumsum Total 0 1 1 1 2 1 2 1 2 2 2 3 0 0 0 3 4 1 1 3 4 5 1 2 3 5 6 1 3 3 6 7 0 0 0 7 8 0 0 0 8 9 1 1 1 9 10 0 0 0
方案说明
- 全程使用
pandas的向量操作与分组聚合,避免逐行循环,处理大数据集时性能优势明显。 group列是核心逻辑:通过状态变化标记独立块,确保后续分组计算仅针对连续的1序列。Total取值为每个连续1块的长度,等价于该块累计和的最大值或最后值。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

