Группировать по% для вычисления веса нечислового значения столбца

#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