Die Anweisungen or
und and
python erfordern truth
-values. Da pandas
diese 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 bool
von 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 , or
aber es passiert auch and
, if
und 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 bool
Anrufe (wie any
, all
, filter
, ...) diese sind in der Regel nicht problematisch , pandas.Series
aber 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 and
und or
Sie 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 if
oder 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 len
gth 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.size
oder if not x.empty
stattdessen if x
.
Wenn Sie Series
enthä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