Pandas布尔DataFrame选择模糊

时间:2014-09-17 22:20:46

标签: python numpy pandas

编辑:固定表中的值。

我们说我有一个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会产生一个模棱两可的案例吗?

3 个答案:

答案 0 :(得分:3)

自定义类型无法覆盖Python中andor的行为。也就是说,Numpy不可能说它希望[0, 1, 1] and [1, 1, 0][0, 1, 0]。这是因为and操作如何短路(见the documentation);本质上,andor的短路行为意味着这些操作必须作为两个参数上的两个单独的真值;他们不能以某种方式组合他们的两个操作数,这两种操作数同时使用两个操作数中的数据(例如,分组比较元素,这对于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