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.
In[1]: df = pd.DataFrame({'A':[True, False, np.nan], 'B':[True, False, True]})
In[2]: df.dropna(inplace=True)
In[3]: df['A']
Out[3]:
0 True
1 False
Name: A, dtype object
In[4]: ~df['A']
Out[4]:
0 -2
0 -1
Name: A, dtype object
Po rozmowie z kolegami na ten temat mam wyjaśnienie: wygląda na to, że pandy wracają do operatora bitowego:
In [1]: ~True
Out[1]: -2
Jak mówi @geher, możesz przekonwertować go na bool za pomocą astype, zanim odwrócisz za pomocą ~
~df['A'].astype(bool)
0 False
1 True
Name: A, dtype: bool
(~df['A']).astype(bool)
0 True
1 True
Name: A, dtype: bool
object
typów odpowiedzi poniżej, aby działały, więc użyj:~ df.astype('bool')