#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