如何利用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
相关产品推荐
相关产品推荐

