我有两个布尔值的数据帧。
第一个看起来像这样:
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
答案 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