Suppose I have the following DataFrame:
In [1]: df Out[1]: apple banana cherry 0 0 3 good 1 1 4 bad 2 2 5 good
It's because df[['apple', 'banana']][df.cherry == 'bad'] = np.nan assigning to the copy of DataFrame. Try this:
df[['apple', 'banana']][df.cherry == 'bad'] = np.nan
df.ix[df.cherry == 'bad', ['apple', 'banana']] = np.nan