#python #python-3.x #pandas
#python #python-3.x #pandas
Вопрос:
У меня есть df ниже как:
day | mealtype
Monday Snack
Monday Snack
Monday Dinner
Tuesday Breakfast
Monday Dinner
Tuesday Dinner
Sunday Snack
Sunday Dinner
Sunday Lunch
Я хочу рассчитать% случаев, когда тип приема пищи встречается каждый день
У меня есть предыдущий код ниже, который дает мне вычисление аналогичного вычисления, которое я ранее кодировал, но он вычислял сумму в группе по столбцу суммы.
cols = ['day', 'mealtype']
cols2 = ['day']
(df.groupby(cols).amount.apply(lambda x: x.sum())/
df.groupby(cols2).amount.apply(lambda x: x.sum()))
Здесь у меня нет суммы, я просто хочу просто рассчитать%, что каждый тип приема пищи происходит в каждый день.
ожидаемый результат:
Monday Snacks .5
Monday Dinner .5
Tuesday Breakfast .5
Tuesday Dinner .5
Sunday Snack .33
Sunday Lunch .33
Sunday Dinner .33
Спасибо!
Комментарии:
1. Я добавил ручной образец вывода только для справки, понедельник содержит 2 ужина и 2 закуски, так что его половина для обоих
Ответ №1:
Пожалуйста groupby(),value_counts(normalize)
, и назовите вывод %
df.groupby('day')['mealtype'].value_counts(normalize=True).to_frame('%').reset_index().round(1)
day mealtype %
0 Monday Dinner 0.5
1 Monday Snack 0.5
2 Sunday Dinner 0.3
3 Sunday Lunch 0.3
4 Sunday Snack 0.3
5 Tuesday Breakfast 0.5
6 Tuesday Dinner 0.5
Ответ №2:
Вот один из возможных способов с groupby
:
df = df.groupby('day')['mealtype'].value_counts().div(df.groupby('day')['mealtype'].count())
df = df.to_frame('percent').reset_index()
print(df)
Вывод:
day mealtype percent
0 Monday Dinner 0.500000
1 Monday Snack 0.500000
2 Sunday Dinner 0.333333
3 Sunday Lunch 0.333333
4 Sunday Snack 0.333333
5 Tuesday Breakfast 0.500000
6 Tuesday Dinner 0.500000