Bewertung pandas-Serie werden Werte mit logischen Ausdrücke und if-Anweisungen
Ich habe Probleme bei der Auswertung die Werte aus einem dictionary mit if-Anweisungen.
Angesichts der folgenden Wörterbuch, die ich importiert aus einem dataframe (falls es wichtig ist):
>>> pnl[company]
29: Active Credit Date Debit Strike Type
0 1 0 2013-01-08 2.3265 21.15 Put
1 0 0 2012-11-26 40 80 Put
2 0 0 2012-11-26 400 80 Put
Habe ich versucht zu bewerten, die folgende Anweisung zu etablieren, die den Wert der Letzte Wert des Active
:
if pnl[company].tail(1)['Active']==1:
print 'yay'
Allerdings war ich konfrontiert mit der folgenden Fehlermeldung:
Traceback (most recent call last):
File "<pyshell#69>", line 1, in <module>
if pnl[company].tail(1)['Active']==1:
File "/usr/lib/python2.7/dist-packages/pandas/core/generic.py", line 676, in __nonzero__
.format(self.__class__.__name__))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Überrascht mich, da konnte ich den Wert anzuzeigen, wollte ich mit dem obigen Befehl ohne die if-Anweisung:
>>> pnl[company].tail(1)['Active']
30: 2 0
Name: Active, dtype: object
Gegeben, dass sich der Wert deutlich von null-und der index 2 ist, ich habe versucht, die folgenden für eine kurze Plausibilitätsprüfung und fand, dass die Dinge nicht passiert, wie ich vielleicht erwartet hätte:
>>> if pnl[company]['Active'][2]==0:
... print 'woo-hoo'
... else:
... print 'doh'
doh
Meine Frage ist:
1) Was könnte hier Los? Ich vermute, ich bin Missverständnis-Wörterbücher auf einigen grundlegenden Ebene.
2) ich bemerkt, dass ich um jeden möglichen gegebenen Wert dieses Wörterbuchs, die Zahl auf der linken Seite um 1 erhöht. Was stellt dieser dar? Zum Beispiel:
>>> pnl[company].tail(1)['Active']
31: 2 0
Name: Active, dtype: object
>>> pnl[company].tail(1)['Active']
32: 2 0
Name: Active, dtype: object
>>> pnl[company].tail(1)['Active']
33: 2 0
Name: Active, dtype: object
>>> pnl[company].tail(1)['Active']
34: 2 0
Name: Active, dtype: object
Vielen Dank im Voraus für jede Hilfe.
Series
Objekte.Dies scheint, wie etwas bestimmtes zu pandas - Bibliothek, die Sie verwenden. Es scheint, als ob die pandas liefert Objekte, die Art von handeln, wie Wörterbücher, unterscheiden sich aber in wichtigen Punkten. Klar, du bist nicht der Umgang mit den üblichen Python-dictionaries hier, aber verwenden eine Datenstruktur, die zur Verfügung gestellt von pandas, dictionary-ähnliche syntax.
Sie ergeben eine Serie, nicht ein Wörterbuch, als solche nicht bewerten kann deine boolean-Abfrage, wie der Fehler schlage vor, Sie tun müssen
pnl[company].tail(1)['Active'].any()==1
obwohl dieser noch einen einzelnen WertMit Bezug auf Ihre zweite Frage, sind Sie verwirrend die Ordnungszahl Ausgabe Nummer? also, wenn Sie gerade wiederholt haben drucken "yay" oder print("Hurra") (für python 3) funktioniert die Nummer noch increment
Die Tatsache, dass Sie immer Fehler wie
The truth value of a Series is ambiguous
aus der pandas-Bibliothek-source-Dateien.InformationsquelleAutor neanderslob | 2014-05-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie erbringen, ist ein Pandas der Serie Objekt-und dies kann nicht bewertet werden, in der Weise, die Sie versuchen, obwohl es nur einen einzigen Wert, den Sie brauchen, um Ihre Linie zu:
Bezug zu Ihrer zweiten Frage, siehe mein Kommentar.
BEARBEITEN
Ab in die Kommentare und link zu Ihrer Ausgabe, ruft
any()
behoben, die Fehlermeldung, aber Ihre Daten ist eigentlich strings, so ist der Vergleich trotzdem gescheitert ist, können Sie entweder tun:Tun, um ein string-Vergleich, oder fix die Daten allerdings war es gelesen oder erzeugt werden.
Oder tun:
Konvertieren
dtype
von der Spalte, so dass Ihr Vergleich mehr richtig.Das sieht aus wie ein string funktioniert
if pnl[company].tail(1)['Active'].any()=='0'
Arbeit? möchten Sie Sie als string oder als int/float?Die
.any()
wird True oder False zurück. Ich bin mir nicht sicher, ob der Vergleich der Rückgabewert vonany
mit 1 ist das, was der OP wirklich will...Ich nicht beobachten, dass, wenn ich rufe
df.tail(1)['col'].any()
es gibt den Wert zurück, der Vergleich ergibt True oder FalseEntweder beheben, aber Sie Lesen die Daten in den ersten Platz, oder dies tun
pnl['Company']['Active'] = pnl['Company']['Active'].astype(int)
InformationsquelleAutor EdChum
Einer Serie ist eine Unterklasse von NDFrame. Die
NDFrame.__bool__
Methode wirft immer einen ValueError. So, versuchen, zu bewerten, eine Serie in einem booleschen Kontext wirft eine ValueError-auch wenn die Serie hat aber einen einzelnen Wert.Der Grund, warum NDFrames haben kein boolescher Wert (err, das ist immer heben ValueError), ist, weil es mehr als ein mögliches Kriterium könnte man vernünftigerweise erwarten, dass für eine NDFrame, um Wahr zu sein. Es könnte bedeuten,
.all()
)Series.any()
).empty()
)Da entweder möglich ist, da unterschiedliche Benutzer haben unterschiedliche Erwartungen, anstatt nur die Wahl eines, das die Entwickler sich weigern, zu erraten, und fordern stattdessen die Benutzer des NDFrame explizit zu machen, welchem Kriterium Sie verwenden möchten.
Die Fehlermeldung listet die wahrscheinlichsten Optionen:
Da in Ihrem Fall, Sie wissen, die Serie enthält nur einen Wert, den Sie verwenden könnten
item
:Bezüglich deiner zweiten Frage: Die zahlen auf der linken Seite scheinen Zeilennummerierung produziert von Ihrem Python-interpreter (PyShell?) - aber das ist nur meine Vermutung.
WARNUNG: Vermutlich
bedeutet, Sie möchten die Bedingung, um Wahr zu sein, wenn der einzige Wert der Reihe gleich 1. Der code
wird Wahr, wenn die dtype der Serie ist numerisch und der Wert der Reihe ist eine beliebige Anzahl andere als 0. Zum Beispiel, wenn wir
pnl[company].tail(1)['Active']
gleichdann
und daher
Ich denke
s.item() == 1
mehr treu bewahrt Ihre beabsichtigte Bedeutung:(s == 1).any()
würde auch funktionieren, aber mitany
nicht ausdrücklich Ihre Absicht sehr deutlich, da Sie wissen, die Serie enthält nur einen Wert.InformationsquelleAutor unutbu
Deine Frage hat nichts zu tun mit Python dictionaries oder native Python überhaupt.
Es geht um pandas-Serie, und die anderen Antworten gab Sie die korrekte syntax:
Interpretieren Sie Ihre Fragen im weiteren Sinne, es geht darum, wie
pandas Series
war bugsiert aufNumPy
, und NumPy historisch bis vor kurzem hatte notorisch schlechte Unterstützung für logische Werte und Operatoren. pandas nicht den besten job Sie können mit dem, was NumPy bietet. Müssen manchmal manuell aufrufen numpy logische Funktionen, anstatt nur das schreiben von code mit beliebigen (Python -) Betreiber ist ärgerlich und umständlich und manchmal bläht pandas code. Auch, Sie haben oft diese für die Leistung (numpy besser als thunking und von native Python). Aber das ist der Preis, den wir bezahlen.Gibt es viele Einschränkungen, Besonderheiten und Fallstricke (Beispiele unten) - der beste Rat ist, werden misstrauisch von booleschen als erste-Klasse-Bürger in pandas aufgrund numpy Einschränkungen:
pandas Vorbehalte und Einschränkungen - zu Verwenden, Wenn/Wahrheit Aussagen mit Pandas
einer Leistung Beispiel: Python ~ kann verwendet werden, anstelle von np.invert() - mehr lesbar, aber 3x langsamer oder schlechter
einige Fallstricke und Einschränkungen: in dem code unten, beachten Sie, dass die jüngsten numpy jetzt können Boolesche Werte (intern dargestellt als int) und ermöglicht die NAs, aber das z.B.
value_counts()
ignoriert NAs (vgl. R 's Tabelle, die option "useNA')..
Kochbuch ist schon eine Weile: pandas-docs.github.io/pandas-docs-travis/cookbook.html
InformationsquelleAutor smci