Las declaraciones or
y and
python requieren truth
valores. Para pandas
estos se consideran ambiguos, por lo que debe utilizar operaciones "bit a bit" |
(o) o &
(y):
result = result[(result['var']>0.25) | (result['var']<-0.25)]
Estos están sobrecargados para este tipo de estructuras de datos para producir el elemento inteligente or
(o and
).
Solo para agregar más explicaciones a esta declaración:
La excepción se produce cuando desea obtener el bool
de un pandas.Series
:
>>> import pandas as pd
>>> x = pd.Series([1])
>>> bool(x)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Lo que golpeó fue un lugar donde el operador convirtió implícitamente los operandos a bool
(usted usó or
pero también sucede para and
, if
y while
):
>>> x or x
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> x and x
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> if x:
... print('fun')
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> while x:
... print('fun')
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Además de estos 4 estados hay varias funciones de Python que se esconden algunas bool
llamadas (como any
, all
, filter
, ...), estos normalmente no son problemáticos con pandas.Series
, pero para lo completo que quería mencionar estos.
En su caso, la excepción no es realmente útil, porque no menciona las alternativas correctas . Para and
y or
puede usar (si desea comparaciones basadas en elementos):
numpy.logical_or
:
>>> import numpy as np
>>> np.logical_or(x, y)
o simplemente el |
operador:
>>> x | y
numpy.logical_and
:
>>> np.logical_and(x, y)
o simplemente el &
operador:
>>> x & y
Si está utilizando los operadores, asegúrese de configurar sus paréntesis correctamente debido a la precedencia del operador .
Hay varias funciones lógicas numpy que deberían funcionar pandas.Series
.
Las alternativas mencionadas en la Excepción son más adecuadas si la encontró al hacer if
o while
. En breve explicaré cada uno de estos:
Si desea verificar si su Serie está vacía :
>>> x = pd.Series([])
>>> x.empty
True
>>> x = pd.Series([1])
>>> x.empty
False
Python normalmente interpreta la len
gth de los contenedores (como list
, tuple
...) como valor de verdad si no tiene una interpretación booleana explícita. Entonces, si desea la comprobación similar a Python, puede hacer: if x.size
o en if not x.empty
lugar de if x
.
Si Series
contiene uno y solo un valor booleano:
>>> x = pd.Series([100])
>>> (x > 50).bool()
True
>>> (x < 50).bool()
False
Si desea verificar el primer y único elemento de su Serie (como .bool()
pero funciona incluso para contenidos no booleanos):
>>> x = pd.Series([100])
>>> x.item()
100
Si desea verificar si todo o algún artículo es cero, no está vacío o no es falso:
>>> x = pd.Series([0, 1, 2])
>>> x.all() # because one element is zero
False
>>> x.any() # because one (or more) elements are non-zero
True
|
lugar deor