Le istruzioni ore andpython richiedono truth-valori. Per pandasquesti 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 booldi 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 orma succede anche per and, ife 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 boolchiamate (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 ande orpuoi 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 ifo 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 length 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.sizeo if not x.emptyinvece di if x.
Se il tuo Seriescontiene 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