gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:39:06 25 4
gpt4 key购买 nike

我有一个如下所示的数据框:

   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 列”中的所有行值 = 0)和(“a 列”中的至少一个行值 = 1)即对于每一行,p 列固定为 0,并且至少有 1 列 = 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

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

最佳答案

您可以使用 ~ 通过 iloc 来反转 boolean 掩码按位置选择:

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

关于python - 使用 &/np.where()/np.any() 比较 Pandas 中多个列的 boolean 行值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42647710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com