Python 布尔数据帧选择模糊
编辑:表中的固定值 假设我有一个熊猫数据帧df:Python 布尔数据帧选择模糊,python,numpy,pandas,Python,Numpy,Pandas,编辑:表中的固定值 假设我有一个熊猫数据帧df: >>>df a b c 0 0.016367 0.289944 -0.891527 1 1.130206 0.899758 -0.276587 2 1.390528 -1.472802 0.128979 3 0.023598 -0.931329 0.158143 4
>>>df
a b c
0 0.016367 0.289944 -0.891527
1 1.130206 0.899758 -0.276587
2 1.390528 -1.472802 0.128979
3 0.023598 -0.931329 0.158143
4 1.401183 -0.162357 -0.959156
5 -0.127765 1.142039 -0.734434
现在我尝试做一些布尔索引:
>>>df[df > 0.5]
a b c
0 NaN NaN Nan
1 1.130206 0.899758 NaN
2 1.390528 NaN NaN
3 NaN NaN NaN
4 1.401183 NaN NaN
5 NaN 1.142039 NaN
>>>df[df < 0]
a b c
0 NaN NaN -0.891527
1 NaN NaN -0.276587
2 NaN -1.472802 NaN
3 NaN -0.931329 NaN
4 NaN -0.162357 -0.959156
5 -0.127765 NaN -0.734434
>>df[df>0.5]
a、b、c
0楠楠楠楠楠
1 1.130206 0.899758 NaN
2 1.390528楠楠
3楠楠楠楠楠
4 1.401183楠楠
5南1.142039南
>>>df[df<0]
a、b、c
0楠楠-0.891527
1楠楠-0.276587
2楠-1.472802楠
3纳米-0.931329纳米
4 NaN-0.162357-0.959156
5-0.127765 NaN-0.734434
现在我尝试对条件进行逻辑OR运算,作为索引条件:
>>>df[df > 0.5 or df < 0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\Ben\Anaconda\lib\site-packages\pandas\core\generic.py", line 692, in __nonzero__
.format(self.__class__.__name__))
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>df[df>0.5或df<0]
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Users\Ben\Anaconda\lib\site packages\pandas\core\generic.py”,第692行,非零__
.format(self.\uuuuuu class.\uuuuuuu.\uuuuuu name.\uuuuuuuuu))
ValueError:数据帧的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。
我已经对此进行了一些研究,这是numpy的开发人员决定的一个基本特性,在任何或所有情况下,某些条件可能是不明确的。我不明白的是为什么检查值是否大于0.5是有效的,检查值是否小于0是有效的,但检查值是否大于0.5或小于0是无效的。我也尝试过混合布尔语法,但这个错误在escable中。有人能解释为什么执行OR会产生不明确的情况吗?您需要使用按位OR,并将条件放在括号中:
df[(df > 0.5) | (df < 0)]
您需要使用按位或,并将条件放在括号中:
df[(df > 0.5) | (df < 0)]
因为逻辑运算符在python中是不可重写的,所以numpy和pandas会重写按位运算符 这意味着您需要使用按位or运算符:
df[(df > 0.5) | (df < 0)]
df[(df>0.5)|(df<0)]
由于逻辑运算符在python中不可重写,numpy和pandas将重写按位运算符
这意味着您需要使用按位or运算符:
df[(df > 0.5) | (df < 0)]
df[(df>0.5)|(df<0)]
在Python中,自定义类型不可能覆盖和以及或的行为。也就是说,Numpy不可能说它希望[0,1,1]和[1,1,0]
成为[0,1,0]
。这是因为和操作短路(请参阅);本质上,和
和或
的短路行为意味着这些操作必须在两个参数上作为两个独立的真值工作;它们不能以同时使用两个操作数中的数据的方式组合两个操作数(例如,以组件方式比较元素,这对于Numpy来说是很自然的)
解决方案是使用位运算符&
和|
。但是,您必须注意这一点,因为优先级不是您所期望的。在Python中,自定义类型不可能覆盖和以及或的行为。也就是说,Numpy不可能说它希望[0,1,1]和[1,1,0]
成为[0,1,0]
。这是因为和操作短路(请参阅);本质上,和
和或
的短路行为意味着这些操作必须在两个参数上作为两个独立的真值工作;它们不能以同时使用两个操作数中的数据的方式组合两个操作数(例如,以组件方式比较元素,这对于Numpy来说是很自然的)
解决方案是使用位运算符&
和|
。但是,您必须小心,因为优先级不是您所期望的。有趣的是,我在numpy中没有注意到这种行为。当你说优先权并不总是你所期望的,你的意思是什么副作用?是否有更惯用的方法基于复合布尔表达式过滤numpy/pandas对象?@user3299166:按位运算符的优先级高于比较运算符,因此例如1<2&0<1
为false(它被解释为(1<(2&0)<1
)。最好使用按位运算符,但将其操作数括起来以避免意外,例如,df[(df.A<5)&(df.B>0)]
。有趣的是,我没有注意到numpy中的这种行为。当你说优先级并不总是你所期望的,你的意思是什么副作用?有没有更惯用的方法基于复合布尔表达式过滤numpy/pandas对象?@user3299166:位运算符的优先级高于比较运算符,因此对于instance1<2&0<1
为假(它被解释为(1<2&0)<1
)。最好使用位运算符,但将其操作数括起来以避免意外情况,例如,df[(df.A<5)和(df.B>0)]
。有没有办法使用任何()?老实说,它没有多大用处,基本上你仍然必须使用位运算符,如果你说df[df.any()>0.5]
如果单个元素满足了条件,它将返回整个df,这将没有多大用处。有没有办法使用any()执行所需的过滤?老实说,它没有多大用处,基本上你仍然必须使用位运算符,如果你说df[df.any()>0.5]
如果单个元素满足条件,它将返回整个df,这将不会有多大用处