在Pandas数据帧的行中查找第一个真值

时间:2017-05-13 00:31:34

标签: python pandas

我有两个布尔值的数据帧。

第一个看起来像这样:

b1=pd.DataFrame([[ True, False, False, False, False],
       [False, False,  True, False, False],
       [False,  True, False, False, False],
       [False, False, False, False, False]])

b1
Out[88]: 
       0      1      2      3      4
0   True  False  False  False  False
1  False  False   True  False  False
2  False   True  False  False  False
3  False  False  False  False  False

如果我只对每行是否有任何True值感兴趣,我可以使用any方法:

b1.any(1)
Out[89]: 
0    True
1    True
2    True
3    False
dtype: bool

但是,我希望根据第二个数据框添加一个约束,如下所示:

b2 = pd.DataFrame([[ True, False,  True, False, False],
       [False, False,  True,  True,  True],
       [ True,  True, False, False, False],
       [ True,  True,  True, False, False]])

b2
Out[91]: 
       0      1      2      3      4
0   True  False   True  False  False
1  False  False   True   True   True
2   True   True  False  False  False
3   True   True   True  False  False

我想识别第一个数据帧中只有True值的行,如果它是第二个数据帧的第一行中的第一个True值。

例如,这将排除第2行,因为虽然它在第一个数据帧中具有True值,但它是第二个数据帧中的第二个真值。相反,第1行和第2行在数据帧1中具有真值,这也是数据帧2中的第一个真值。输出应该如下:

0    True
1    True
2    False
3    False
dtype: bool

3 个答案:

答案 0 :(得分:7)

一种方法是使用cumsum来帮助找到第一个:

In [123]: (b1 & b2 & (b2.cumsum(axis=1) == 1)).any(axis=1)
Out[123]: 
0     True
1     True
2    False
3    False
dtype: bool

这是有效的,因为b2.cumsum(axis=1)给出了我们看到的Trues的累积数量,并且该数字为1且b2本身为True的情况必须是第一个。

In [124]: b2.cumsum(axis=1)
Out[124]: 
   0  1  2  3  4
0  1  1  2  2  2
1  0  0  1  2  3
2  1  2  2  2  2
3  1  2  3  3  3

答案 1 :(得分:1)

作为@ DSM聪明答案的变体,这种方法对我来说似乎更直观一些。第一部分应该是非常不言自明的,第二部分找到第一个列号(w / axis = 1),对于每个数据帧都是如此并进行比较。

(b1.any(axis = 1) & (b1.idxmax(axis = 1) == b2.idxmax(axis = 1))

答案 2 :(得分:1)

制定了一个与pshep123解决方案类似的解决方案。

# the part on the right of & is to check if the first True position in b1 matches the first True position in b2.

b1.any(1) & (b1.values.argmax(axis=1) == b2.values.argmax(axis=1))
Out[823]: 
0     True
1     True
2    False
3    False
dtype: bool