Сохраните маски в переменных, чтобы их можно было использовать позже:
df = pd.DataFrame({"col1":[np.NaN,"Cat","Cheese"],
"col2":["Dog","Cheese","Dog"],
"col3":[np.NaN,"Cat","Dog"]})
copy_mask = df.isnull()
df = df.bfill()
same_mask = df!=df.iloc[0]
df[same_mask]+=" (Not same)"
df[copy_mask]+=" (Copy)"
print (df)
col1 col2 col3
0 Cat (Copy) Dog Cat (Copy)
1 Cat Cheese (Not same) Cat
2 Cheese (Not same) Dog Dog (Not same)