As instruções or
e and
python requerem truth
-values. Como pandas
estes são considerados ambíguos, você deve usar "bit a bit" |
(ou) ou&
(e):
result = result[(result['var']>0.25) | (result['var']<-0.25)]
Elas estão sobrecarregadas para esse tipo de estrutura de dados para gerar a or
(ou and
).
Apenas para adicionar mais explicações a esta declaração:
A exceção é lançada quando você deseja obter o bool
de a 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().
O que você acertar era um lugar onde o operador implicitamente convertido os operandos bool
(que usou or
mas também acontece para and
, if
e 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().
Além desses 4 declarações existem várias funções do Python que escondem algumas bool
chamadas (como any
, all
, filter
, ...), estes normalmente não são problemáticas compandas.Series
mas para ser completo eu queria mencionar estes.
No seu caso, a exceção não é realmente útil, porque não menciona as alternativas corretas . Para and
e or
você pode usar (se quiser comparações entre elementos):
numpy.logical_or
:
>>> import numpy as np
>>> np.logical_or(x, y)
ou simplesmente o |
operador:
>>> x | y
numpy.logical_and
:
>>> np.logical_and(x, y)
ou simplesmente o &
operador:
>>> x & y
Se você estiver usando os operadores, certifique-se de definir seus parênteses corretamente devido a à precedência do operador .
Existem várias funções numpy lógicas que devem funcionar empandas.Series
.
As alternativas mencionadas na exceção são mais adequadas se você a encontrar ao executar if
ouwhile
. Em breve vou explicar cada um destes:
Se você deseja verificar se sua série está vazia :
>>> x = pd.Series([])
>>> x.empty
True
>>> x = pd.Series([1])
>>> x.empty
False
O Python normalmente interpreta o len
g - ésimo de contêineres (como list
, tuple
...) como valor de verdade se não tiver uma interpretação booleana explícita. Portanto, se você quiser a verificação do tipo python, poderá fazer: if x.size
ou em if not x.empty
vez deif x
.
Se o seu Series
contiver um e apenas um valor booleano:
>>> x = pd.Series([100])
>>> (x > 50).bool()
True
>>> (x < 50).bool()
False
Se você deseja verificar o primeiro e único item da sua série (como .bool()
mas funciona mesmo para conteúdos não booleanos):
>>> x = pd.Series([100])
>>> x.item()
100
Se você deseja verificar se todo ou qualquer item não é zero, não está vazio ou não é 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
|
vez deor