如何统计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]
逻辑说明
- 先通过
group_id把连续的零或1分成独立的组; - 遍历所有零组,检查该零组的前一个元素是否是1、后一个元素是否是1;
- 仅保留同时满足前后都有1的零组,统计它们的长度。
内容的提问来源于stack exchange,提问作者Ринат Хафизов
相关产品推荐
相关产品推荐

