Ответ @ unutbu находится на месте, просто хотел добавить предупреждение о том, что вашей маске должно быть dtype bool, а не «object». Т.е. у вашей маски не было бы когда-либо был любой нан. См. здесь - даже если ваша маска теперь ненанна, она останется типом объекта.
Обратный к серии «объект» не будет вызывать ошибку, вместо этого вы получите мусорную маску ints, которая не будет работать так, как вы ожидаете.
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