Python 检查n个连续元素是否等于x,以及之前的任何元素是否大于x
我有一个6分钟读数的熊猫数据框。我想将每一行标记为NF或DF。 NF=5个连续条目为0且至少一个先前读数大于0的行 DF=不符合NF规则的所有其他行Python 检查n个连续元素是否等于x,以及之前的任何元素是否大于x,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个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] 我可以用滑动窗吗?做这件事的好方法是什么? 利用起始numpy矢量解,给出了真值矩阵的两个运算条件 使用True为
[[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]
我可以用滑动窗吗?做这件事的好方法是什么?- 利用起始numpy矢量解,给出了真值矩阵的两个运算条件
- 使用True为1的事实,因此可以使用
cumsum()
- 第五个零点的位置应比第一个零点高出4个位置
- 如果您只需要数组,则
会给出该数组,而无需将if赋回数据帧列np.where()
- 使用了另一个测试用例
,其中有许多零,但不是5个连续的[1,0,0,0,0,1,0,0,0]
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")
)