Die Anweisungen orund andpython erfordern truth-values. Da pandasdiese als mehrdeutig angesehen werden, sollten Sie "bitweise" |(oder) oder &(und) Operationen verwenden:
result = result[(result['var']>0.25) | (result['var']<-0.25)]
Diese sind für diese Art von Datenstrukturen überladen, um das Element or(oder and) zu erhalten.
Nur um dieser Aussage eine weitere Erklärung hinzuzufügen:
Die Ausnahme wird ausgelöst , wenn Sie die bekommen boolvon ein 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().
Was Sie schlagen war ein Ort , an dem der Bediener implizit die Operanden umgewandelt bool(Sie verwendet , oraber es passiert auch and, ifund 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().
Neben diesen vier Aussagen gibt es mehrere Python - Funktionen , die einige verstecken boolAnrufe (wie any, all, filter, ...) diese sind in der Regel nicht problematisch , pandas.Seriesaber der Vollständigkeit halber wollte ich diese ganz zu schweigen.
In Ihrem Fall ist die Ausnahme nicht wirklich hilfreich, da sie nicht die richtigen Alternativen erwähnt . Für andund orSie können verwenden (wenn Sie elementweise Vergleiche wünschen):
numpy.logical_or::
>>> import numpy as np
>>> np.logical_or(x, y)
oder einfach der |Betreiber:
>>> x | y
numpy.logical_and::
>>> np.logical_and(x, y)
oder einfach der &Betreiber:
>>> x & y
Wenn Sie die Operatoren verwenden, stellen Sie sicher, dass Sie Ihre Klammern aufgrund der Priorität des Operators richtig eingestellt haben .
Es gibt mehrere logische numpy Funktionen , die sollten arbeiten pandas.Series.
Die in der Ausnahme genannten Alternativen sind besser geeignet, wenn Sie beim Ausführen von ifoder auf sie gestoßen sind while. Ich werde diese kurz erläutern:
Wenn Sie überprüfen möchten, ob Ihre Serie leer ist :
>>> x = pd.Series([])
>>> x.empty
True
>>> x = pd.Series([1])
>>> x.empty
False
Python interpretiert normalerweise die length von Containern (wie list, tuple, ...) als Wahrheitswert , wenn es keine explizite boolean Interpretation hat. Wenn Sie also die Python-ähnliche Prüfung wünschen, können Sie Folgendes tun: if x.sizeoder if not x.emptystattdessen if x.
Wenn Sie Seriesenthält einen und nur eine Booleschen Wert:
>>> x = pd.Series([100])
>>> (x > 50).bool()
True
>>> (x < 50).bool()
False
Wenn Sie das erste und einzige Element Ihrer Serie überprüfen möchten (wie .bool(), funktioniert aber auch für nicht boolesche Inhalte):
>>> x = pd.Series([100])
>>> x.item()
100
Wenn Sie überprüfen möchten, ob alle oder einige Elemente nicht Null, nicht leer oder nicht falsch sind:
>>> 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
|anstelle vonor