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

如何统计DataFrame中位于1之间的连续零的数量?

统计DataFrame中两1之间连续零的数量

首先给出你的原始数据:

ID   A  B  C
60   0  1  1
120  0  1  1
180  0  1  1
240  0  0  0
300  0  0  0 
360  1  1  0
420  1  1  1
480  0  0  0
540  0  0  0 
600  0  0  0
660  0  0  0
720  1  1  1
780  1  0  1
840  0  0  0
900  0  0  0 

需求是统计各列中仅被两个1包围的连续零的数量,对应结果:A列[4],B列[2,4],C列[3,4]。

以下是基于Pandas的实现方案:

步骤1:构建DataFrame

import pandas as pd

data = {
    'ID': [60, 120, 180, 240, 300, 360, 420, 480, 540, 600, 660, 720, 780, 840, 900],
    'A': [0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0],
    'B': [1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0],
    'C': [1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0]
}
df = pd.DataFrame(data)

步骤2:定义处理函数

这个函数会单独处理每一列,筛选出被1前后包围的连续零段并统计长度:

def count_zeros_between_ones(series):
    # 标记每个位置是否为1
    is_one = series == 1
    # 生成连续相同值的分组(连续零或连续1各为一组)
    group_id = (is_one != is_one.shift(1)).cumsum()
    
    # 筛选出所有全是零的分组
    zero_groups = series[~is_one].groupby(group_id[~is_one])
    valid_lengths = []
    
    for _, zero_segment in zero_groups:
        # 获取当前零段的首尾索引
        start_idx = zero_segment.index[0]
        end_idx = zero_segment.index[-1]
        
        # 检查零段前一个位置是否是1,后一个位置是否是1
        has_left_one = start_idx > 0 and is_one.iloc[start_idx - 1]
        has_right_one = end_idx < len(series) - 1 and is_one.iloc[end_idx + 1]
        
        if has_left_one and has_right_one:
            valid_lengths.append(len(zero_segment))
    
    return valid_lengths

步骤3:应用到各列并输出结果

for col in ['A', 'B', 'C']:
    print(f"{col}列结果: {count_zeros_between_ones(df[col])}")

运行后会输出:

A列结果: [4]
B列结果: [2, 4]
C列结果: [3, 4]

逻辑说明

  1. 先通过group_id把连续的零或1分成独立的组;
  2. 遍历所有零组,检查该零组的前一个元素是否是1、后一个元素是否是1;
  3. 仅保留同时满足前后都有1的零组,统计它们的长度。

内容的提问来源于stack exchange,提问作者Ринат Хафизов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:47:32