La respuesta de @unutbu es acertada, solo quería agregar una advertencia de que su máscara debe ser dtype bool, no 'object'. Es decir, su máscara no puede haber nunca tenido ninguna de Nan. Vea aquí , incluso si su máscara no tiene nan ahora, seguirá siendo del tipo 'objeto'.
El inverso de una serie de 'objetos' no arrojará un error, sino que obtendrá una máscara de basura que no funcionará como espera.
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
Después de hablar con colegas sobre este tema, tengo una explicación: parece que los pandas están volviendo al operador bit a bit:
In [1]: ~True
Out[1]: -2
Como dice @geher, puede convertirlo en bool con un tipo antes de invertir con ~
~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
tipos para que las respuestas a continuación funcionen, así que use:~ df.astype('bool')