Le istruzioni or
e and
python richiedono truth
-valori. Per pandas
questi sono considerati ambigui, quindi è necessario utilizzare le operazioni "bit per bit" |
(o) o &
(e):
result = result[(result['var']>0.25) | (result['var']<-0.25)]
Questi sono sovraccarichi per questo tipo di strutture dati per produrre l'elemento saggio or
(o and
).
Solo per aggiungere qualche spiegazione in più a questa affermazione:
L'eccezione viene generata quando si desidera ottenere il bool
di 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().
Quello che hai colpito è stato un luogo in cui l'operatore ha convertito implicitamente gli operandi bool
(hai usato or
ma succede anche per 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().
Oltre a questi 4 affermazioni ci sono diverse funzioni Python che nascondono alcune bool
chiamate (come any
, all
, filter
, ...) questi non sono normalmente problematico con pandas.Series
, ma per completezza ho voluto parlare di questi.
Nel tuo caso l'eccezione non è davvero utile, perché non menziona le alternative giuste . Per and
e or
puoi usare (se vuoi confronti a livello di elemento):
numpy.logical_or
:
>>> import numpy as np
>>> np.logical_or(x, y)
o semplicemente l' |
operatore:
>>> x | y
numpy.logical_and
:
>>> np.logical_and(x, y)
o semplicemente l' &
operatore:
>>> x & y
Se si utilizzano gli operatori, assicurarsi di impostare correttamente la parentesi a causa della precedenza dell'operatore .
Esistono diverse funzioni logiche intorpidite che dovrebbero funzionare pandas.Series
.
Le alternative menzionate nell'eccezione sono più adatte se l'hai incontrata durante l'esecuzione if
o while
. Spiegherò brevemente ciascuno di questi:
Se vuoi verificare se la tua serie è vuota :
>>> x = pd.Series([])
>>> x.empty
True
>>> x = pd.Series([1])
>>> x.empty
False
Python interpreta normalmente la len
gth di contenitori (come list
, tuple
, ...) come valore di verità se non ha nessuna interpretazione esplicita booleano. Quindi, se vuoi il controllo simile a Python, potresti fare: if x.size
o if not x.empty
invece di if x
.
Se il tuo Series
contiene un solo valore booleano:
>>> x = pd.Series([100])
>>> (x > 50).bool()
True
>>> (x < 50).bool()
False
Se vuoi controllare il primo e unico elemento della tua serie (come .bool()
ma funziona anche per contenuti non booleani):
>>> x = pd.Series([100])
>>> x.item()
100
Se si desidera verificare se tutto o qualsiasi elemento è diverso da zero, non vuoto o non 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
|
invece dior