编辑:固定表中的值。
我们说我有一个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 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
所以现在我尝试将thos的逻辑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().
我对此进行了一些研究,这是numpy的开发人员根据任何或所有情况决定某些条件可能含糊不清的基本特征。我不知道的是为什么检查值是否为&gt; 0.5有效并检查其是否&lt; 0有效,但检查其是否> 0.5或< 0是无效的。我也试过混淆布尔语法,但是这个错误是可以接受的。有人可以解释为什么做OR会产生一个模棱两可的案例吗?
答案 0 :(得分:3)
自定义类型无法覆盖Python中and
和or
的行为。也就是说,Numpy不可能说它希望[0, 1, 1] and [1, 1, 0]
为[0, 1, 0]
。这是因为and
操作如何短路(见the documentation);本质上,and
和or
的短路行为意味着这些操作必须作为两个参数上的两个单独的真值;他们不能以某种方式组合他们的两个操作数,这两种操作数同时使用两个操作数中的数据(例如,分组比较元素,这对于Numpy来说是很自然的。)
解决方案是使用按位运算符&
和|
。但是,你必须要小心,因为优先级不是你所期望的。
答案 1 :(得分:1)
由于逻辑运算符在python中不可覆盖,numpy和pandas会覆盖按位运算符。
这意味着你需要使用bitwise-or运算符:
df[(df > 0.5) | (df < 0)]
答案 2 :(得分:0)
您需要使用按位或将条件放在括号中:
df[(df > 0.5) | (df < 0)]
原因是因为当数组中的某些值满足条件时比较数组是不明确的,这就是为什么它变得模糊不清。
如果您调用了属性any
,那么它将评估为True。
由于运算符优先级,必须使用括号。
示例:
In [23]:
df = pd.DataFrame(randn(5,5))
df
Out[23]:
0 1 2 3 4
0 0.320165 0.123677 -0.202609 1.225668 0.327576
1 -0.620356 0.126270 1.191855 0.903879 0.214802
2 -0.974635 1.712151 1.178358 0.224962 -0.921045
3 -1.337430 -1.225469 1.150564 -1.618739 -1.297221
4 -0.093164 -0.928846 1.035407 1.766096 1.456888
In [24]:
df[(df > 0.5) | (df < 0)]
Out[24]:
0 1 2 3 4
0 NaN NaN -0.202609 1.225668 NaN
1 -0.620356 NaN 1.191855 0.903879 NaN
2 -0.974635 1.712151 1.178358 NaN -0.921045
3 -1.337430 -1.225469 1.150564 -1.618739 -1.297221
4 -0.093164 -0.928846 1.035407 1.766096 1.456888