基于Python Pandas为时序DataFrame实现两种条件计数器需求
场景1 实现方案
逻辑说明
- counter1:连续出现的0的累积计数,遇到1则重置为0,累计到3后保持3直到遇到1重置
- counter2:当counter1<3时,无论
case1-0是0还是1都持续递增计数;当counter1达到3时,重置为1重新开始计数
代码实现
import pandas as pd # 构建示例DataFrame df1 = pd.DataFrame({ 'case1-0': [1,1,1,0,0,0,1,1,0,0,1] }) # 计算counter1:分组统计连续0的累积和,超过3则截断为3 group1 = (df1['case1-0'] == 1).cumsum() df1['counter1'] = df1.groupby(group1)['case1-0'].apply(lambda x: (x == 0).cumsum()).clip(upper=3) # 计算counter2:按counter1=3的重置点分组,每组内从1开始递增计数 reset_points = df1['counter1'] == 3 reset_groups = reset_points.cumsum() df1['counter2'] = df1.groupby(reset_groups).cumcount() + 1
场景2 实现方案
逻辑说明
- counter1:连续出现的1的累积计数,遇到0则重置为0
- counter2:仅当前一行的counter1>3时,统计连续0的数量;其他情况为0
代码实现
# 构建示例DataFrame df2 = pd.DataFrame({ 'case1-0': [1,1,1,1,0,0,0,1,1,0,0,1] }) # 计算counter1:分组统计连续1的累积和 group2 = (df2['case1-0'] == 0).cumsum() df2['counter1'] = df2.groupby(group2)['case1-0'].cumsum() # 计算counter2:仅对符合条件的连续0计数,全程向量化操作高效处理大数据 valid_0 = (df2['case1-0'] == 0) & (df2['counter1'].shift(1) > 3) valid_groups = valid_0.cumsum() - valid_0.cumsum().where(~valid_0).ffill().fillna(0) df2['counter2'] = valid_groups.groupby(valid_groups).cumcount() + 1 df2['counter2'] = df2['counter2'].where(valid_0, 0)
内容的提问来源于stack exchange,提问作者jess
相关产品推荐
相关产品推荐

