групповая агрегация на уровне дня столбца даты и времени в pandas - PullRequest
1 голос
/ 06 апреля 2020

У меня есть датафрейм, как показано ниже. Это данные о бронировании врачами.

  Doctor     Appointment              Show
  A          2020-01-18 12:00:00      Yes
  A          2020-01-18 12:30:00      Yes
  A          2020-01-18 13:00:00      No
  A          2020-01-18 13:30:00      Yes
  B          2020-01-18 12:00:00      Yes
  B          2020-01-18 12:30:00      Yes
  B          2020-01-18 13:00:00      No
  B          2020-01-18 13:30:00      Yes
  B          2020-01-18 16:00:00      No
  B          2020-01-18 16:30:00      Yes
  A          2020-01-19 12:00:00      Yes
  A          2020-01-19 12:30:00      Yes
  A          2020-01-19 13:00:00      No
  A          2020-01-19 13:30:00      Yes
  A          2020-01-19 14:00:00      Yes
  A          2020-01-19 14:30:00      No
  A          2020-01-19 16:00:00      No
  A          2020-01-19 16:30:00      Yes
  B          2020-01-19 12:00:00      Yes
  B          2020-01-19 12:30:00      Yes
  B          2020-01-19 13:00:00      No
  B          2020-01-19 13:30:00      Yes
  B          2020-01-19 14:00:00      No
  B          2020-01-19 14:30:00      Yes
  B          2020-01-19 15:00:00      No
  B          2020-01-18 15:30:00      Yes

На приведенном выше кадре данных я хотел бы создать функцию в pandas, которая будет выводить следующее.

Я пробовал ниже

def Doctor_date_summary(doctor, date):
   Number of slots = df.groupby([doctor, date] ).sum()

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

Doctor_date_summary(Doctor, date)
If Doctor = A, date = 2020-01-19

Number of slots = 8
Number of show up = 5
show up percentage = 62.5

, где число Да = 5 в столбце показа на эту дату для этой докторской степени

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Вы можете создать каждую маску отдельно в функции, затем последовательно по & для побитового AND и sum для счетчика:

df['Appointment'] = pd.to_datetime(df['Appointment'])

def Doctor_date_summary(doctor, date):
    m1 = df['Doctor'] == doctor
    m2 = df['Appointment'].dt.normalize() == date
    m3 = df['Show'] == 'Yes'
    show_up = (m1 & m2 & m3).sum()
    no = (m1 & m2).sum()
    return show_up, no

up, no = Doctor_date_summary('A', '2020-01-19')

Используются последние для вывода f-string s:

print(f"Number of slots = {up}")
print(f"Number of show up = {no}")
print(f"show up percentage = {up/no*100}")
Number of slots = 5
Number of show up = 8
show up percentage = 62.5
1 голос
/ 06 апреля 2020

Вы можете сначала создать столбец дня, из здесь :

df['day'] = df['Appointment'].dt.floor('d')

Затем вы можете использовать логическое индексирование:

def Doctor_date_summary(Doctor, date):
    number_of_show_up = np.sum((df['Doctor']==Doctor) & (df['day']==date) & (df['Show']=='Yes'))
    number_of_slots = np.sum((df['Doctor']==Doctor) & (df['day']==date))

    return number_of_show_up, number_of_slots, 100*number_of_show_up/number_of_slots

Наконец:

number_of_show_up, number_of_slots, percentage = Doctor_date_summary('A', '2020-01-19')

print("Number of slots = {}".format(number_of_slots))
print("Number of show up = {}".format(number_of_show_up))
print("show up percentage = {:.1f}".format(percentage))

Number of slots = 8
Number of show up = 5
show up percentage = 62.5
...