Mam Series
obiekt pandy zawierający wartości logiczne. Jak mogę uzyskać serię zawierającą logikę NOT
każdej wartości?
Rozważmy na przykład serię zawierającą:
True
True
True
False
Seria, którą chciałbym uzyskać, zawierałaby:
False
False
False
True
Wydaje się, że powinno to być dość proste, ale najwyraźniej zgubiłem moje mojo = (
object
typów odpowiedzi poniżej, aby działały, więc użyj:~ df.astype('bool')
Odpowiedzi:
Aby odwrócić liczbę logiczną, użyj
~s
:Korzystanie z Python2.7, NumPy 1.8.0, Pandas 0.13.1:
Począwszy od Pand 0.13.0, Serie nie są już podklasami
numpy.ndarray
; są teraz podklasamipd.NDFrame
. Może to mieć coś wspólnego z tym, dlaczegonp.invert(s)
nie jest już tak szybki jak~s
lub-s
.Uwaga:
timeit
wyniki mogą się różnić w zależności od wielu czynników, w tym wersji sprzętu, kompilatora, systemu operacyjnego, Pythona, NumPy i Pandas.źródło
-
?tilde
jak wspomniano w dokumentacji, ale nie działał on tak samo jaknp.invert
: Snp.invert(s)
,~s
a-s
wszystkie są takie same.np.bitwise_not(s)
działa tak samo jaknp.inverse
).Odpowiedź @ unutbu jest na miejscu, chciałem tylko dodać ostrzeżenie, że twoja maska musi być dtype bool, a nie „obiekt”. To znaczy, twoja maska nigdy nie miała żadnych nan. Zobacz tutaj - nawet jeśli maska jest teraz wolna od nanometrów, pozostanie typem „obiektowym”.
Odwrotna seria „obiektowa” nie wyrzuci błędu, zamiast tego otrzymasz maskę śmieci int, która nie będzie działać zgodnie z oczekiwaniami.
Po rozmowie z kolegami na ten temat mam wyjaśnienie: wygląda na to, że pandy wracają do operatora bitowego:
Jak mówi @geher, możesz przekonwertować go na bool za pomocą astype, zanim odwrócisz za pomocą ~
źródło
.astype(bool)
np.~df['A'].astype(bool)
astype(bool)
dzieje się przed~
~df['A'].astype(bool)
vs(~df['A']).astype(bool)
Po prostu daję temu szansę:
źródło
-
! Będę o tym pamiętać następnym razem.Możesz także użyć
numpy.invert
:EDYCJA: Różnica w wydajności pojawia się w Ubuntu 12.04, Python 2.7, NumPy 1.7.0 - nie wydaje się jednak istnieć przy użyciu NumPy 1.6.2:
źródło
NumPy działa wolniej, ponieważ przekazuje dane wejściowe do wartości boolowskich (więc None i 0 stają się False, a wszystko inne staje się True).
daje Ci
podczas gdy ~ s ulegnie awarii. W większości przypadków tylda byłaby bezpieczniejszym wyborem niż NumPy.
Pandy 0,25, NumPy 1,17
źródło