如何统计Pandas列指定长度滑动窗口内-1的数量
实现方案
完全可以通过pandas的rolling方法实现需求,向量化运算的写法效率远高于自定义lambda,具体如下:
核心思路
- 将
mod1列的异常值(-1)映射为1、正常值(1)映射为0,直接对滑动窗口求和即可得到窗口内的异常个数 - 配置
min_periods=1参数保证窗口长度不足p时也会返回计算结果,匹配你给出的输出示例
完整可运行代码
import pandas as pd # 你的示例数据 df = pd.DataFrame({'mod1': [1, 1, 1, -1, -1, 1, -1, -1, -1]}) p = 3 # 自定义滑动窗口长度 # 核心实现逻辑 df['n_anomalies_p'] = (df['mod1'] == -1).astype(int)\ .rolling(window=p, min_periods=1)\ .sum()\ .astype(int)
可选lambda写法
如果你需要用lambda自定义计算逻辑,也可以用如下写法,输出结果和上面完全一致:
df['n_anomalies_p'] = df['mod1'].rolling(window=p, min_periods=1)\ .apply(lambda window: (window == -1).sum())\ .astype(int)
参数说明
window=p:指定滑动窗口的长度为pmin_periods=1:只要窗口内有至少1个元素就计算结果,若去掉该参数,前p-1行的统计结果会返回空值NaN,你可以根据实际需求调整- 两种写法的输出结果完全匹配你给出的示例:
[0, 0, 0, 1, 2, 2, 2, 2, 3]
内容的提问来源于stack exchange,提问作者PynoobT
相关产品推荐
相关产品推荐

