W moim przypadku miałem serię pand, w której wartościami są krotki znaków :
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)
Dlatego mogłem użyć indeksowania do filtrowania serii, ale do utworzenia indeksu potrzebowałem apply
. Mój warunek to „znajdź wszystkie krotki, które mają dokładnie jedno 'H'”.
series_of_tuples[series_of_tuples.apply(lambda x: x.count('H')==1)]
Przyznaję, że nie można go „łączyć w łańcuch” (tj. Zauważ, że powtarzamseries_of_tuples
dwa razy; musisz przechowywać dowolną tymczasową serię w zmiennej, aby móc wywołać na niej (...)).
Mogą istnieć również inne metody (poza .apply(...)
), które mogą działać elementarnie, aby utworzyć indeks boolowski.
Wiele innych odpowiedzi (w tym zaakceptowana odpowiedź) przy użyciu funkcji łańcuchowych, takich jak:
.compress()
.where()
.loc[]
[]
Akceptują wywołania (lambdy), które są stosowane do serii , a nie do poszczególnych wartości w tych seriach!
Dlatego moja seria krotek zachowywała się dziwnie, gdy próbowałem użyć powyższego warunku / wywoływanej / lambda, z dowolną funkcją łańcuchową, taką jak .loc[]
:
series_of_tuples.loc[lambda x: x.count('H')==1]
Powoduje błąd:
KeyError: „Poziom H musi być taki sam jak nazwa (brak)”
Byłem bardzo zdezorientowany, ale wydaje mi się, że używa series_of_tuples.count(...)
funkcji Series.count , co nie jest tym, czego chciałem.
Przyznaję, że alternatywna struktura danych może być lepsza:
- Typ danych kategorii?
- Dataframe (każdy element krotki staje się kolumną)
- Seria ciągów (po prostu połącz razem krotki):
Tworzy to serię ciągów (np. Przez konkatenację krotki; łączenie znaków w krotce w jednym ciągu)
series_of_tuples.apply(''.join)
Więc mogę wtedy użyć łańcuchaSeries.str.count
series_of_tuples.apply(''.join).str.count('H')==1