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