Pandas booleanas DataFrame selección ambigüedad

EDITAR: Valores fijos en tablas.

Digamos que tengo un df de datos de pandas:

>>>df abc 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 

Así que ahora trato de hacer una indexación booleana:

 >>>df[df > 0.5] abc 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] abc 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 

Así que ahora trato de hacer el OR lógico de estas condiciones como la condición de indexación:

 >>>df[df > 0.5 or df < 0] Traceback (most recent call last): File "", line 1, in  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(). 

He investigado esto un poco, es una característica básica que los desarrolladores de Numpy decidieron que ciertas condiciones pueden ser ambiguas dependiendo del caso o del todo. Lo que no entiendo es por qué comprobar si el valor es> 0.5 es válido y si es 0.5 o <0 NO VÁLIDO. También he intentado mezclar la sintaxis booleana, pero este error está en escable. ¿Alguien puede explicar por qué hacer el OR crea un caso ambiguo?

No es posible que los tipos personalizados anulen el comportamiento de y or en Python. Es decir, no es posible que Numpy diga que quiere que [0, 1, 1] and [1, 1, 0] sean [0, 1, 0] . Esto se debe a que la operación and operación se cortocircuitan (consulte la documentación ); en esencia, el comportamiento de cortocircuito de and or y significa que estas operaciones deben funcionar como dos valores de verdad separados en los dos argumentos; no pueden combinar sus dos operandos de alguna manera que haga uso de los datos en ambos operandos a la vez (por ejemplo, para comparar los elementos por componentes, como sería natural para Numpy).

La solución es utilizar los operadores bitwise y | . Sin embargo, debes tener cuidado con esto, ya que la prioridad no es lo que podrías esperar.

Dado que los operadores lógicos no son anulables en python, numpy y pandas anulan los operadores bitwise.

Esto significa que necesita utilizar el operador bitwise o

 df[(df > 0.5) | (df < 0)] 

Debe usar el bit a bit o poner las condiciones entre paréntesis:

 df[(df > 0.5) | (df < 0)] 

La razón es porque es ambiguo comparar arreglos cuando quizás algunos de los valores en el arreglo satisfacen la condición, es por eso que se vuelve ambiguo.

Si llamaras el atributo any entonces se evaluaría como True.

Los paréntesis son necesarios debido a la precedencia del operador.

Ejemplo:

 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