Filtering a panda dataframe in one line
The first groupby - counts the number of persons per day per meal

The second groupby - counts the number of unique persons in each day

The inner merge between the 2 - matches the number of persons per day+meal to be equal to the number of persons on that day

We've left with a df that contains day-meal couples in each row, with the number of persons that had a meal which matches the total number of persons on that day:



Now we only need to groupby day and create the set of the meals 

df.groupby(['day','meal']).count().reset_index()\ 
  .merge(df.groupby('day')['person'].apply(lambda x: len(set(x))).reset_index(), 
         on=['day','person'])\ 
  .groupby(['day'])['meal'].apply(set)