首页 > 解决方案 > 检查列中的值是否为真,则左侧的所有值也为真

问题描述

+------+------+------+------+------+
| ColA | ColB | ColC | ColD | ColE |
+------+------+------+------+------+
|    1 |    1 |    1 |    1 |    1 |
|    1 |    1 |    0 |    1 |    0 |
|    0 |    1 |    1 |    1 |    1 |
+------+------+------+------+------+

看一下上面的示例表,目标是检查列中的值是否为真,但同一行中其左侧的一列或多列不为真的情况。

我用一个凌乱的嵌套 if 语句完成了这个,从 开始ColE,检查它是否为真,然后检查ColAthroughColD是否也为真,然后ColD去做同样的事情,直到我检查了每一列(ColA不需要要检查,因为它的左侧没有列)。

因此,例如,该逻辑会将第二行和第三行标记为错误,因为错误列右侧的列是正确的,但第一行是可以的。

有没有办法简化这个逻辑,或者这是否优雅?

标签: pythonpandasdataframe

解决方案


您可以使用:

df.shift(-1, axis=1).le(df).iloc[:,:-2].all(axis=1)

输出:

0     True
1    False
2    False
dtype: bool

在第一步中,我们将所有值向左移动:

df.shift(-1, axis=1)

输出:

   ColA  ColB  ColC  ColD  ColE
0   1.0   1.0   1.0   1.0   NaN
1   1.0   0.0   1.0   0.0   NaN
2   1.0   1.0   1.0   1.0   NaN

在第二步中,我们比较移位值是否小于或等于原始值:

df.shift(-1, axis=1).le(df)

输出:

    ColA  ColB   ColC  ColD   ColE
0   True  True   True  True  False
1   True  True  False  True  False
2  False  True   True  True  False

在最后一步中,我们忽略最后一列并检查每行中的所有值是否都是True.


推荐阅读