Ответ @ unutbu точен, просто хотел добавить предупреждение, что ваша маска должна быть dtype bool, а не 'object'. Т.е. у твоей маски не могло быть ни одной няньки. Смотрите здесь - даже если ваша маска теперь не содержит наночастиц, она останется типом «объект».
Инверсия серии 'object' не выдаст ошибку, вместо этого вы получите мусорную маску int, которая не будет работать так, как вы ожидаете.
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
После разговора с коллегами об этом у меня есть объяснение: похоже, панда возвращается к побитовому оператору:
In [1]: ~True
Out[1]: -2
Как говорит @geher, вы можете преобразовать его в bool с помощью astype, прежде чем обратное с ~
~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
типов для ответов ниже, чтобы работать, поэтому используйте:~ df.astype('bool')