Python: агрегирование и усреднение строк на основе нескольких условий - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь найти среднее время в пути для среднего рабочего дня = 5 дней и среднего выходного дня = 2 дня. '

Я пытаюсь агрегировать и найти среднее значение для всех строк с одинаковыми «Time» и «Day_type». Поскольку значения «Время» также включают секунды, я нахожу некоторые проблемы с сопоставлением всех значений времени, которые принадлежат одному и тому же «Времени».

Мой фрейм данных настроен следующим образом:

  veh-time distance Date    Time        Day_of_week Day_type
0   72  379.0   2018-10-18  22:15:21    Thursday    Weekday
1   72  379.0   2018-10-18  22:30:21    Friday      Weekend
2   72  379.0   2018-10-18  22:45:22    Saturday    Weekend
3   72  379.0   2018-10-18  23:00:20    Sunday      Weekday
4   72  379.0   2018-10-18  23:15:21    Monday      Weekday
5   72  379.0   2018-10-18  23:15:21    Tuesday     Weekday
6   72  379.0   2018-10-18  23:15:21    Wednesday   Weekday
7   72  379.0   2018-10-18  22:15:21    Thursday    Weekday
8   72  379.0   2018-10-18  22:30:21    Friday      Weekend
9   72  379.0   2018-10-18  22:45:22    Saturday    Weekend
10  72  379.0   2018-10-18  23:00:20    Sunday      Weekday
11  72  379.0   2018-10-18  23:15:21    Monday      Weekday
12  72  379.0   2018-10-18  23:15:21    Tuesday     Weekday
13  72  379.0   2018-10-18  23:15:21    Wednesday   Weekday

Я предполагаю, что процесс будет выглядеть так:

ШАГ 1: разделите столбец «Время», чтобы он только показывал ЧЧ: ММ. Возможно, используйте regex или str.split()

ШАГ 2: сгруппировать все строки времени, которые соответствуют 'Time' И 'Day_type' - например, все строки со временем 22:15 и типом дня Weekday

ШАГ 3: добавьте новый столбец: 'avg_vt' после нахождения среднего значения для сгруппированных строк на шаге 2. avg_vt = veh-time + veh-time и т. д. / число идентифицированных экземпляров Day_type

Спасибо,

R

1 Ответ

0 голосов
/ 06 ноября 2018

Используйте transform для нового столбца, заполненного совокупными значениями, для извлечения HH:MM используется rsplit с n=1 для разделения с правой стороны только с первым : или преобразовать в datetime, а затем в HH:MM строку с strftime:

df['avg_vt'] = df.groupby([df['Time'].str.rsplit(':', n=1).str[0], 
                          'Day_type'])['veh-time'].transform('mean')

Альтернатива:

df['avg_vt'] = df.groupby([pd.to_datetime(df['Time']).dt.strftime('%H:%M'), 
                          'Day_type'])['veh-time'].transform('mean')

print (df)
    veh-time  distance        Date      Time Day_of_week Day_type  avg_vt
0         72     379.0  2018-10-18  22:15:21    Thursday  Weekday      72
1         72     379.0  2018-10-18  22:30:21      Friday  Weekend      72
2         72     379.0  2018-10-18  22:45:22    Saturday  Weekend      72
3         72     379.0  2018-10-18  23:00:20      Sunday  Weekday      72
4         72     379.0  2018-10-18  23:15:21      Monday  Weekday      72
5         72     379.0  2018-10-18  23:15:21     Tuesday  Weekday      72
6         72     379.0  2018-10-18  23:15:21   Wednesday  Weekday      72
7         72     379.0  2018-10-18  22:15:21    Thursday  Weekday      72
8         72     379.0  2018-10-18  22:30:21      Friday  Weekend      72
9         72     379.0  2018-10-18  22:45:22    Saturday  Weekend      72
10        72     379.0  2018-10-18  23:00:20      Sunday  Weekday      72
11        72     379.0  2018-10-18  23:15:21      Monday  Weekday      72
12        72     379.0  2018-10-18  23:15:21     Tuesday  Weekday      72
13        72     379.0  2018-10-18  23:15:21   Wednesday  Weekday      72

Detail

print (df['Time'].str.rsplit(':', n=1).str[0])
0    22:15
1    22:30
2    22:45
3    23:00
4    23:15
5    23:15
...
Name: Time, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...