我有一张带有3个安全压力选项和一个拒绝压力(恒定)的表,例如:
|SafeOpt1|SafeOpt2|SafeOpt3|RefP|
---------------------------------
|0 |0 |37 |23 |
|0 |0 |0 |23 |
|0 |25 |0 |23 |
|0 |0 |0 |23 |
我需要使用以下逻辑返回值:选项1中的第一个非零值,如果所有选项1均为0,则选项2中的第一个非零值,如果所有选项2均为0,则选项3中的第一个非零值,如果所有选项3都为0,然后接受拒绝压力。
因此,在上述情况下,它将返回25。我有以下代码通过一栏进行编号:
SafeP = next((i for i, x in enumerate(Output.SafeOpt1) if x), Output.refusalpressure)
但是我需要将它们链接在一起,但是没有成功。
答案 0 :(得分:1)
使用np.ravel
和np.nonzero
In [407]: x = df.values.ravel('K')
In [408]: x[np.nonzero(x)][0]
Out[408]: 25
In [409]: x[np.nonzero(x)]
Out[409]: array([25, 37, 23, 23, 23, 23], dtype=int64)
或
In [412]: x[x != 0][0]
Out[412]: 25
答案 1 :(得分:0)
通过使用melt
+ idxmax
更新
df.melt().value[df.melt().value.ne(0).idxmax()]
Out[536]: 25
答案 2 :(得分:0)
unstack
+ x!=0
x = df.unstack().reset_index()[0]
x[x!=0].iloc[0]