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

如何利用Pandas计算布尔序列中连续True片段的长度?

解决方法

嘿,这个需求用Pandas其实有挺简洁的实现方式,我帮你捋清楚思路,直接上代码加解释:

首先,我们先构造你给出的示例序列(把0/1转成布尔值):

import pandas as pd

# 对应你给出的序列:000011100000001100000001111100010000
s = pd.Series([0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,0,0,0,0]).astype(bool)

接下来,核心思路是先把连续相同值的块分组,再筛选出值为True的块,提取它们的长度:

# 1. 生成分组键:每次值发生切换时标记为True,累加后得到每个连续块的唯一ID
group_ids = s.ne(s.shift()).cumsum()

# 2. 按分组ID聚合,计算每个块的长度;再筛选出原块值为True的那些,转成列表
result = s.groupby(group_ids).size()[s.groupby(group_ids).first()].tolist()

print(result)  # 输出: [3, 2, 5, 1]

关键步骤解释:

  • s.ne(s.shift()):对比当前元素和前一个元素是否不同,不同则返回True,这样就找到了所有值的切换点。
  • cumsum():将切换点的布尔值累加,每个连续的相同值块会被分配同一个分组ID。
  • s.groupby(group_ids).size():计算每个分组的元素个数,也就是连续相同值的长度。
  • s.groupby(group_ids).first():获取每个分组的第一个元素(同一分组内元素值相同),用这个来筛选出值为True的分组,最后转成列表就是你要的结果。

如果你喜欢更紧凑的链式写法,也可以这样写:

result = s.groupby(s.ne(s.shift()).cumsum()).filter(lambda x: x.iloc[0]).size().tolist()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:40:36