使用 & / np.where() / np.any() 比较 Pandas 中多个列的布尔行值

Compare Boolean Row values across multiple Columns in Pandas using & / np.where() / np.any()

我的数据框如下所示:

   a A  a B  a C  a D  a E  a F  p A  p B  p C  p D  p E  p F
0    0    0    0    0    0    0    0    0    0    0    0    0
1    1    0    0    0    0    0    0    0    0    0    0    0
2    0    1    0    0    0    0    0    0    1    0    0    0
3    0    0    1    0    0    1    0    0    0    0    0    0
4    0    0    0    1    0    1    0    0    0    0    0    0
5    0    0    0    0    1    0    0    0    0    0    0    0
6    0    0    0    0    0    0    1    0    0    0    0    0

df = pd.DataFrame({'p A':[0,0,0,0,0,0,1],'p B':[0,0,0,0,0,0,0],'p C':[0,0,1,0,0,0,0],'p D':[0,0,0,0,0,0,0],'p E':[0,0,0,0,0,0,0],'p F':[0,0,0,0,0,0,0],'a A':[0,1,0,0,0,0,0],'a B':[0,0,1,0,0,0,0],'a C':[0,0,0,1,0,0,0],'a D':[0,0,0,0,1,0,0],'a E':[0,0,0,0,0,1,0],'a F': [0,0,0,1,1,0,0]})

注意:这是我的实际数据的简化版本。

a代表Actual; p代表预测; A - F 代表一系列标签

我想编写一个查询,对于我的数据框中的每一行,returns True 条件是:("p columns" = 0 中的所有行值)和([ 中的至少一个行值=31=] = 1) 即对于每一行,p 列固定为 0,并且至少有 1 列 = 1.

使用 Pandas Dataframe Find Rows Where all Columns Equal and Compare two columns using pandas 的答案 我目前通过使用 &np.any()

来实现这一点
((df.iloc[:,6] == 0) & (df.iloc[:,7] == 0) & (df.iloc[:,8] == 0) & (df.iloc[:,9] == 0) & (df.iloc[:,10] == 0) & (df.iloc[:,11] == 0) & df.iloc[:,0:6].any(axis = 1) )

>>
0    False
1     True
2    False
3     True
4     True
5     True
6    False
dtype: bool

有没有更简洁、更易读的方法可以实现这个目标?

您可以将 ~ 用于反转布尔掩码,将 iloc 用于 select 按位置:

print (~df.iloc[:,6:11].any(1) & df.iloc[:,0:6].any(1))
0    False
1     True
2    False
3     True
4     True
5     True
6    False
dtype: bool

或使用 filter for select by column names, any for check at least one True or all 检查所有值是否每行 True

函数eq用于与0进行比较。

print (~df.filter(like='p').any(1) & df.filter(like='a').any(1))
0    False
1     True
2    False
3     True
4     True
5     True
6    False
dtype: bool

print (df.filter(like='p').eq(0).all(1) & df.filter(like='a').any(1))
0    False
1     True
2    False
3     True
4     True
5     True
6    False
dtype: bool