Групповой счет и соотношение на основе заданных условий c в pandas - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть кадр данных, как показано ниже:

Bookin_ID   Session     Walkin
   1             S1          no
   2             S1          no
   3             S1          no
   4             S1          yes
   5             S1          no
   6             S1          yes
   10            S2          no
   11            S2          yes
   12            S2          no
   13            S2          yes
   14            S2          no
   15            S2          yes
   16            S2          no
   17            S2          no
   18            S2          yes
   19            S2          no
   26            S3          no
   27            S3          no
   28            S3          yes
   29            S3          no

Исходя из вышеизложенного, я хотел бы рассчитать вероятность перехода для каждой сессии, как показано ниже:

walkin_prob =  count of walkin = 'yes' in that session / total number of booking in that session

Например, для Сеанс = S1, количество Walkin = нет равно 2, а общее количество бронирований равно 6, поэтому walkin_prob = 2/6 = 0,33.

Аналогично для S2 количество Walkin = да равно 4 и общее количество бронирований 10, так что walkin_prob = 4/10 = 0,4. и т. д.

Ожидаемый результат:

Bookin_ID     Session      Walkin     walkin_prob
   1             S1          no       0.33
   2             S1          no       0.33
   3             S1          no       0.33
   4             S1          yes      0.33
   5             S1          no       0.33
   6             S1          yes      0.33
   10            S2          no       0.33
   11            S2          yes      0.4
   12            S2          no       0.4
   13            S2          yes      0.4
   14            S2          no       0.4
   15            S2          yes      0.4
   16            S2          no       0.4
   17            S2          no       0.4
   18            S2          yes      0.4
   19            S2          no       0.4
   26            S3          no       0.25
   27            S3          no       0.25
   28            S3          yes      0.25
   29            S3          no       0.25

Я пробовал ниже, и это не работает.

df['walkin_prob'] = df.groupby('Session')[['Walkin'] == 'yes'].sum()/df.groupby('Session')['Walkin'].sum()

И это показывает ниже ошибка

Колонка не найдена: False

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Вы были почти там. Просто [['Walkin'] == 'yes'] не правильная запись. Он оценивается как False (который не является столбцом).

Вы можете использовать .loc для фильтрации по df['Walkin'] == 'yes':

df.loc[df['Walkin'] == 'yes'].groupby('Session').sum() / df.groupby('Session').sum()
         walkin_prob
Session             
S1          0.333333
S2          0.407125
S3          0.250000
2 голосов
/ 22 апреля 2020

Вы можете использовать transform для этого:

df['walkin_prob'] = df.groupby('Session')['Walkin'].transform(lambda x: x[x == 'yes'].count() / x.count())

Когда из функции в transform возвращается одно значение, оно будет использоваться для каждого из строки в группе. Вышеуказанное даст точно ожидаемый результат.

...