Python在多个列中返回第一个非零值

时间:2018-07-19 13:57:44

标签: python pandas numpy

我有一张带有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)

但是我需要将它们链接在一起,但是没有成功。

3 个答案:

答案 0 :(得分:1)

使用np.ravelnp.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]