我的数据框如下:
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]})
注意:这是我实际数据的简化版本。
表示实际; p代表预测; A - F代表一系列标签
我想编写一个查询,对于我的数据框中的每一行,在以下情况下返回True :(“p columns”中的所有行值= 0)和(“a列”中的至少一个行值= 1)即对于每一行,p列固定为0,至少1列固定为=。
使用Pandas Dataframe Find Rows Where all Columns Equal和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
有没有更简洁,可读的方式来实现这个目标?
答案 0 :(得分: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
,以检查至少一个True
或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