Группировка по 2 столбцам с вычислением квантиля 3-го числового столбца

#python #python-3.x #pandas

#python #python-3.x #pandas

Вопрос:

У меня есть df ниже как:

  day     mealtype    oz
Monday   Snack      .34
Monday   Snack      .43
Monday   Dinner     .31
Tuesday  Breakfast  .10
Monday   Dinner     .11
Tuesday  Dinner     .09
Sunday   Snack      .33
Sunday   Dinner     .01
Sunday   Lunch      .03
  

Ниже у меня есть код, который вычисляет% от каждого типа приема пищи за каждый день

  df.groupby('day')['mealtype'].value_counts(normalize=True).to_frame('%').reset_index().round(1)
  

Как я могу настроить этот код, чтобы он давал мне квантили — p50 и p90 столбца oz, но также сгруппированные по типу приема пищи day и mealtype?

Спасибо!

Ответ №1:

Вы можете попробовать это

 p50 = df.groupby(['day','mealtype']).agg(p50 = ('oz',lambda x: x.quantile(0.5))).reset_index()
p90 = df.groupby(['day','mealtype']).agg(p90 = ('oz',lambda x: x.quantile(0.9))).reset_index()
new_df=p50.merge(p90, on=['day','mealtype'])
new_df
  

или

 new_df = df.groupby(['day','mealtype'])['oz'].agg(p50 = (lambda x: x.quantile(0.5)),
                                         p90 = (lambda x: x.quantile(0.9))).reset_index()
  

вывод

      day    mealtype    p50     p90
0   Monday  Dinner      0.210   0.290
1   Monday  Snack       0.385   0.421
2   Sunday  Dinner      0.010   0.010
3   Sunday  Lunch       0.030   0.030
4   Sunday  Snack       0.330   0.330
5   Tuesday Breakfast   0.100   0.100
6   Tuesday Dinner      0.090   0.090
  

Ответ №2:

Давайте попробуем groupby().quantile() :

 (df.groupby(['day','mealtype'])['oz']
   .quantile(q=[0.5,0.9])
   .unstack(level=-1)
   .rename(columns=lambda x: f'p{int(x*100)}') # rename columns
)
  

Вывод:

                      p50    p90
day     mealtype               
Monday  Dinner     0.210  0.290
        Snack      0.385  0.421
Sunday  Dinner     0.010  0.010
        Lunch      0.030  0.030
        Snack      0.330  0.330
Tuesday Breakfast  0.100  0.100
        Dinner     0.090  0.090