熊猫过滤和列布尔运算可能在一行中吗?



我想将熊猫数据帧的以下过滤减少到一行

首先举个DF的例子:

dff = pd.DataFrame({'myfiltercol':[1,1,1,2,2],
'D':[True,False,True,False,True],
'E':[False,True,False,True,False]})
print(dff)
myfiltercol      D      E
0            1   True  False
1            1  False   True
2            1   True  False
3            2  False   True
4            2   True  False

现在对于 myfiltercol = 1 的情况,我想在 D 和 E 的列值之间进行布尔运算 OR,看看是否所有值都为真。

我能够在两行中做到这一点:

dff2   = dff.loc[(dff['myfiltercol'] == 1),['D','E']]
result = all(dff2['D'] | dff2['E'])

出于某种原因,我需要一行。 有人知道怎么做?

谢谢。

您可以使用DataFrame.any而不是逻辑或两列之间,因为您已经对它们进行了索引,并且DataFrame.all减少到单个布尔值:

dff.loc[(dff['myfiltercol'] == 1),['D','E']].any(1).all()
# True

或者,如果这些是您拥有的所有列,您也可以执行以下操作:

dff.set_index('myfiltercol').loc[1].any(1).all()
# True

这能行吗?

>>> dff.loc[(dff['myfiltercol'] == 1),:].eval('D | E').all()
True

最新更新