首页 > 解决方案 > 检查 n 个连续元素是否等于 x 并且任何前一个元素是否大于 x

问题描述

我有一个 6 分钟读数的熊猫数据框。我想将每一行标记为 NF 或 DF。NF = 5 个连续条目为 0 且至少一个先前读数大于 0 的行 DF = 不符合 NF 规则的所有其他行

[[4,6,7,2,1,0,0,0,0,0]
 [6,0,0,0,0,0,2,2,2,5]
 [0,0,0,0,0,0,0,0,0,0]
 [0,0,0,0,0,4,6,7,2,1]]

预期结果:

[NF, NF, DF, DF]

我可以为此使用滑动窗口吗?这样做的好pythonic方式是什么?

标签: pythonpandasdataframe

解决方案


  • 使用凝视 numpy 向量化解决方案,两个条件在真值矩阵上运行
  • 使用True1的事实,因此cumsum()可以使用
  • 第 5 个零的位置应该比第 1 个高 4 个位置
  • 如果您只想要数组,则np.where()无需将 if 分配回数据框列即可
  • 使用了另一个测试用例[1,0,0,0,0,1,0,0,0,0],其中有很多零,但不是连续 5 个
df = pd.DataFrame([[4,6,7,2,1,0,0,0,0,0],
 [6,0,0,0,0,0,2,2,2,5],
 [0,0,0,0,0,0,0,0,0,0],
 [1,0,0,0,0,1,0,0,0,0],
 [0,0,0,0,0,4,6,7,2,1]])

df = df.assign(res=np.where(
    # five consecutive zeros
    ((np.argmax(np.cumsum(df.eq(0).values, axis=1)==1, axis=1)+4) == 
     np.argmax(np.cumsum(df.eq(0).values, axis=1)==5, axis=1)) &
    # first zero somewhere other that 0th position
    np.argmax(df.eq(0).values, axis=1)>0
    ,"NF","DF")
)


0 1 2 3 4 5 6 7 8 9 资源
0 4 6 7 2 1 0 0 0 0 0 NF
1 6 0 0 0 0 0 2 2 2 5 NF
2 0 0 0 0 0 0 0 0 0 0 东风
3 1 0 0 0 0 1 0 0 0 0 东风
4 0 0 0 0 0 4 6 7 2 1 东风

推荐阅读