You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:15:37