如何在Pandas滚动窗口中按条件筛选行并进行计数?
要实现滚动窗口内仅统计controlled列为True的行数,核心思路是将布尔值转换为可累加的数值,再通过滚动求和完成计数,具体操作如下:
- 将
controlled列的布尔值转为整数(True对应1,False对应0),滚动窗口内的求和结果即为满足条件的行数 - 使用
rolling().sum()替代原有的rolling().count(),直接对转换后的数值列进行滚动求和
修改后的代码示例
替换你原代码中计算rolling_obs_count的行,新增统计满足条件行数的列:
# 新增统计controlled=True行数的滚动窗口列 df['rolling_controlled_count'] = df['controlled'].astype(int).rolling(window='1s').sum()
效果验证
以你提供的前5行数据为例:
2020-01-01 00:00:00.048713 1.024082 4.491483 True 1.0
2020-01-01 00:00:00.068628 1.084577 0.773474 True 2.0
2020-01-01 00:00:00.202953 1.091360 0.584872 True 3.0
2020-01-01 00:00:00.425483 1.125268 2.361184 False 4.0
2020-01-01 00:00:00.665378 1.127335 2.050226 True 5.0
对应的rolling_controlled_count列值会是:1.0、2.0、3.0、3.0、4.0,准确统计了每个1秒窗口内controlled=True的行数。
性能说明
这种方法比使用rolling().apply(lambda x: x.sum())效率更高,因为sum是Pandas优化过的向量化操作,避免了逐窗口的Python级循环,在大数据集上优势明显。
内容的提问来源于stack exchange,提问作者Henry

