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

如何按连续1值序列及其结束后一行分组Pandas DataFrame

分组连续1值序列及其后续行的解决方案

原始数据

import pandas as pd
df = pd.DataFrame({'a': [1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0]})

需求说明

需要按连续的1值序列,加上该序列结束后的那一行进行分组。例如第一组包含前三行连续的1,以及紧随其后的一行0;连续的多个0中,仅保留每个1序列后的第一个0,其余0行不纳入分组。期望分组结果如下:

a
0   1
1   1
2   1
3   0

4   1
5   0

6   1
7   1
8   0

10  1
11  1
12  0

尝试过的无效方法

曾尝试相关分组方案及以下代码,但均无法得到预期结果:

df.groupby(df.a.diff().cumsum().eq(1))

可行解决方案

通过标记连续1序列、筛选目标行后分组,代码如下:

# 标记每个连续1序列的唯一编号
streak = df['a'].ne(0).cumsum()
# 生成分组键:仅保留连续1的行,以及每个1序列后的第一个0行
group_key = streak.where(df['a'].eq(1) | (df['a'].eq(0) & df['a'].shift(1).eq(1)))
# 移除无分组的行(即连续0中不属于1序列后续的行)
target_df = df[group_key.notna()]
# 按分组键完成分组
result_groups = target_df.groupby(group_key)

# 遍历输出每个分组(验证结果)
for _, group in result_groups:
    print(group)
    print()

代码说明

  1. streak = df['a'].ne(0).cumsum():给每一段连续的1序列分配唯一编号,连续0的行继承前一个编号(直到下一段1出现)。
  2. group_key:筛选出两类行:值为1的行,以及值为0且前一行是1的行,其余行标记为NaN。
  3. 移除NaN行后,剩余行就是需要分组的目标数据,按group_key分组即可得到符合需求的结果。

内容的提问来源于stack exchange,提问作者AmirX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:15:59