python - 检查 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方式是什么?
解决方案
- 使用凝视 numpy 向量化解决方案,两个条件在真值矩阵上运行
- 使用True为1的事实,因此
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 | 东风 |
推荐阅读
- java - 从字符串的开头删除 X 字符的出现,直到在 Java 中找不到不同的字符
- r - R Drake - 将 make() 配置为根本不使用缓存
- javascript - 断开连接后,Socket.io 不会从数组中删除用户对象
- node.js - 将 webpack 设置为 --host 0.0.0.0 不起作用
- hbase - 无法在 Mac OS 上启动 hbase
- c# - Unity3d Android/Windows 应用程序与库的集成
- apache-spark - ^M 添加到火花输出中
- scala - 将两个数组合并为 jsonObjects 数组
- .net - Angular POST 请求响应为空(但服务器返回正确的字符串)
- lua - 有没有办法使用 lua 使用 ESP NOW 协议?