2017-03-07 107 views
2

我有一个数据帧,看起来像:使用及/ 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代表一系列标签

我想编写一个查询,对于我的数据框中的每一行,在下列情况下返回True:(“p columns”= 0中的所有行值)和(至少一个行值在“一列” = 1)即,对于每一行,p列被固定在0和至少1列= 1

使用答案Pandas Dataframe Find Rows Where all Columns EqualCompare 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 

有没有更简洁可读的方法我可以做到这一点?

回答

3

您可以通过位置使用~为反转布尔面具与iloc的选择:

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用于选择通过列名,any用于检查至少一个Trueall进行检查,如果所有值都每行有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 
+0

哪一个是最 “Python化”/最大熊猫使用? – Chuck

+0

这取决于你,但我更喜欢'过滤器'解决方案,因为更加动态 - 如果添加了一些列,解决方案stil完美工作。 – jezrael

+0

好极了。谢谢! – Chuck