如何统计Pandas数据框中列标识触发后无零值间隔的累计天数
实现方案
直接通过分组累计计数即可满足需求,完整代码如下:
import pandas as pd df = pd.DataFrame({'input': [1,1,1,0,0,0,1,1,1,0,0,0]}, index=pd.date_range('2021-10-01', periods=12)) # 标记input从1变为0的触发点 df['change'] = 0 df.loc[(df['input'].shift(1) - df['input']) > 0, 'change'] = 1 # 核心逻辑:生成分组ID + 分组内累计计数 df['group_id'] = df['change'].cumsum() df['res'] = df.groupby('group_id').cumcount() + 1 # 把第一个触发点之前的行结果置为0 df.loc[df['group_id'] == 0, 'res'] = 0 # 可选:删除辅助列group_id df = df.drop('group_id', axis=1) print(df)
运行后输出和预期完全一致:
input change res 2021-10-01 1 0 0 2021-10-02 1 0 0 2021-10-03 1 0 0 2021-10-04 0 1 1 2021-10-05 0 0 2 2021-10-06 0 0 3 2021-10-07 1 0 4 2021-10-08 1 0 5 2021-10-09 1 0 6 2021-10-10 0 1 1 2021-10-11 0 0 2 2021-10-12 0 0 3
逻辑说明
df['change'].cumsum()会在每次触发change=1时生成新的分组ID,同一计数周期内的行都会被分到同一个组groupby('group_id').cumcount() + 1实现每个分组内从1开始的逐行累计计数- 第一个分组(
group_id=0)对应还没有触发过变更的周期,直接把该分组的res统一置为0即可符合要求
内容的提问来源于stack exchange,提问作者SkyWalker
相关产品推荐
相关产品推荐

