如何统计Pandas DataFrame中input列从1变为0后的累计天数
解决方案
你可以通过给连续0序列分组+组内计数的方式实现需求,核心是用eq(1).cumsum()生成分组标识,把每一段连续的0划分到同一个分组,再对组内做计数即可,完整代码如下:
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)) # 一行代码生成res列,不需要提前计算change列也可以实现 df['res'] = df.groupby(df['input'].eq(1).cumsum()).cumcount().add(1).where(df['input'].eq(0), 0) print(df)
运行后输出和你要求的效果完全一致:
input res 2021-10-01 1 0 2021-10-02 1 0 2021-10-03 1 0 2021-10-04 0 1 2021-10-05 0 2 2021-10-06 0 3 2021-10-07 1 0 2021-10-08 1 0 2021-10-09 1 0 2021-10-10 0 1 2021-10-11 0 2 2021-10-12 0 3
逻辑说明
df['input'].eq(1).cumsum():每次遇到input=1时累计值加1,相当于给每一段连续的0分配了唯一的分组ID,比如示例里前三行1对应分组ID1,接下来三行0也属于分组ID1,再三行1对应分组ID2,最后三行0属于分组ID2。groupby(分组ID).cumcount().add(1):对每个分组内的行按顺序生成从1开始的序号,连续0段的序号正好就是从1开始的天数。where(df['input'].eq(0), 0):把input=1的行的计数结果替换为0,符合需求。
如果你已经提前生成了change列,也可以用类似逻辑实现,上面的写法更简洁,不需要额外依赖change列。
内容的提问来源于stack exchange,提问作者SkyWalker
相关产品推荐
相关产品推荐

