In meinem Fall hatte ich eine Panda-Serie, in der die Werte Tupel von Zeichen sind :
Out[67]
0 (H, H, H, H)
1 (H, H, H, T)
2 (H, H, T, H)
3 (H, H, T, T)
4 (H, T, H, H)
Daher könnte ich die Indizierung verwenden, um die Serien zu filtern, aber um den Index zu erstellen, den ich brauchte apply
. Mein Zustand ist "finde alle Tupel, die genau ein 'H' haben".
series_of_tuples[series_of_tuples.apply(lambda x: x.count('H')==1)]
Ich gebe zu, es ist nicht "verkettbar" ist (dh ich wiederhole esseries_of_tuples
zweimal; Sie müssen alle temporären Reihen in einer Variablen speichern, damit Sie apply (...) darauf aufrufen können).
Es kann (nebenbei ) auch andere Methoden geben, die elementweise arbeiten können, um einen Booleschen Index zu erzeugen..apply(...)
Viele andere Antworten (einschließlich akzeptierter Antworten), die die verkettbaren Funktionen verwenden, wie:
.compress()
.where()
.loc[]
[]
Diese akzeptieren Callables (Lambdas), die auf die Serie angewendet werden , nicht auf die einzelnen Werte in diesen Serien!
Daher verhielt sich meine Tupelreihe seltsam, als ich versuchte, meine obige Bedingung / callable / lambda mit einer der verkettbaren Funktionen zu verwenden, wie .loc[]
:
series_of_tuples.loc[lambda x: x.count('H')==1]
Erzeugt den Fehler:
KeyError: 'Level H muss mit name (None) identisch sein'
Ich war sehr verwirrt, aber es scheint, die Series.count- series_of_tuples.count(...)
Funktion zu verwenden , was ich nicht wollte.
Ich gebe zu, dass eine alternative Datenstruktur besser sein könnte:
- Ein Datentyp der Kategorie?
- Ein Datenrahmen (jedes Element des Tupels wird zu einer Spalte)
- Eine Reihe von Zeichenfolgen (verketten Sie einfach die Tupel miteinander):
Dadurch wird eine Reihe von Zeichenfolgen erstellt (dh durch Verketten des Tupels; Zusammenfügen der Zeichen im Tupel zu einer einzelnen Zeichenfolge).
series_of_tuples.apply(''.join)
So kann ich dann die verkettbare verwendenSeries.str.count
series_of_tuples.apply(''.join).str.count('H')==1