熊猫布尔数据帧选择不明确



编辑:表中的固定值。

假设我有一个熊猫数据帧 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 中 andor 的行为。 也就是说,Numpy不可能说它希望[0, 1, 1] and [1, 1, 0] [0, 1, 0] 。 这是因为and操作如何短路(请参阅文档(;从本质上讲,andor 的短路行为意味着这些操作必须作为两个参数上的两个单独的真值工作;它们不能以某种方式组合它们的两个操作数,同时利用两个操作数中的数据(例如,按组件比较元素,这对于 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

最新更新