编辑:表中的固定值。
假设我有一个熊猫数据帧 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
所以现在我尝试对条件进行逻辑 OR 作为索引条件:
>>>df[df > 0.5 or df < 0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:UsersBenAnacondalibsite-packagespandascoregeneric.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的开发人员决定某些条件可能不明确,具体取决于任何或所有情况。 我不明白的是为什么检查值是否> 0.5 有效并检查其<0 是否有效,但检查其> 0.5 或 <0 是否无效。 我也尝试混淆布尔语法,但这个错误是错误的。 有人可以解释为什么做手术室会产生模棱两可的情况吗?
自定义类型不可能覆盖 Python 中 and
和 or
的行为。 也就是说,Numpy不可能说它希望[0, 1, 1] and [1, 1, 0]
[0, 1, 0]
。 这是因为and
操作如何短路(请参阅文档(;从本质上讲,and
和 or
的短路行为意味着这些操作必须作为两个参数上的两个单独的真值工作;它们不能以某种方式组合它们的两个操作数,同时利用两个操作数中的数据(例如,按组件比较元素,这对于 Numpy 来说是很自然的(。
解决方案是使用按位运算符&
和|
。 但是,您必须小心这一点,因为优先级不是您所期望的。
由于逻辑运算符在python中不可覆盖,numpy和pandas覆盖了按位运算符。
这意味着您需要使用按位或运算符:
df[(df > 0.5) | (df < 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