I dumb down your example a bit. What you basically have is
df = pd.DataFrame(['aa', 'ab', 'c'], columns={'val'})
>>> df[df.val.str.contains('a').fillna(False)]
Out[737]:
val
0 aa
1 ab
>>> df[df.val.str.contains('a').fillna(False) == False]
Out[738]:
val
2 c
All that contains()
returns is an array containing booleans - standard procedures are applicable.