считать прыжки из одного места в другое в зависимости от условий - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть следующий фрейм данных.

    id  start   finish  location
0   1   2015-12-14 16:44:00 2015-12-15 18:00:00 A
1   1   2015-12-15 18:00:00 2015-12-16 13:00:00 B
2   1   2015-12-16 13:00:00 2015-12-16 20:00:00 C
3   2   2015-12-10 13:15:00 2015-12-12 13:45:00 B
4   2   2015-12-12 13:45:00 2015-12-12 19:45:00 A
5   3   2015-12-15 07:45:00 2015-12-15 18:45:00 A
6   3   2015-12-15 18:45:00 2015-12-18 07:15:00 D
7   3   2015-12-18 07:15:00 2015-12-19 10:45:00 C
8   3   2015-12-19 10:45:00 2015-12-20 09:00:00 H
9   4   2015-12-09 10:45:00 2015-12-13 12:20:00 E
10  4   2015-12-13 12:20:00 2015-12-13 18:20:00 A
11  4   2015-12-13 18:20:00 2015-12-13 23:40:00 A
12  4   2015-12-13 23:40:00 2015-12-16 08:00:00 B
13  5   2015-12-07 08:00:00 2015-12-13 12:25:00 H

Я хотел вычислить переходы из одного местоположения в другое в каждом 'id'.Для этого количества прыжков сначала я хотел сравнить дату и время окончания столбца с датой и временем начала столбца следующей строки того же идентификатора.Если он совпадает, я хочу, чтобы счет равнялся 1 другому. Что я хочу получить, это следующее:

    id  start   count
0   1   2015-12-14 16:44:00 1
1   1   2015-12-15 18:00:00 1
2   1   2015-12-16 13:00:00 0
3   2   2015-12-10 13:15:00 1
4   2   2015-12-12 13:45:00 0
5   3   2015-12-15 07:45:00 1
6   3   2015-12-15 18:45:00 1
7   3   2015-12-18 07:15:00 1
8   3   2015-12-19 10:45:00 0
9   4   2015-12-09 10:45:00 1
10  4   2015-12-13 12:20:00 1
11  4   2015-12-13 18:20:00 1
12  4   2015-12-13 23:40:00 0
13  5   2015-12-07 08:00:00 0

Как только я получу это, я хотел бы суммировать количество на основе даты кполучить что-то вроде следующего:

date    count_sum
2015-12-07  0
2015-12-09  1
2015-12-10  1
2015-12-12  0
2015-12-13  2
2015-12-14  1
2015-12-15  3
2015-12-16  0
2015-12-18  1
2015-12-19  0

Для меня последнюю часть легко сделать, выполнив groupby () на основе даты и используя .sum () для суммирования всех подсчетов на эту дату.Но как получить первую часть, где мы считаем реальные прыжки, не ясно.Любая помощь будет оценена.

1 Ответ

0 голосов
/ 24 сентября 2018

Ваши данные уже отсортированы по 'start', поэтому вы можете просто groupby и проверить, совпадает ли время окончания со временем начала следующей строки с помощью pandas.Series.shift()

I 'Не советуем вызывать столбец 'count', так как это встроенная функция для панд, поэтому вы не можете использовать нотацию Series.col_name.

#df['start'] = pd.to_datetime(df.start)
#df['finish'] = pd.to_datetime(df.finish)
df['count'] = (df.groupby('id').apply(lambda x: x.finish == x.start.shift(-1))
                 .astype('int').reset_index(level=0, drop=True))

Вывод:

    id               start              finish location  count
0    1 2015-12-14 16:44:00 2015-12-15 18:00:00        A      1
1    1 2015-12-15 18:00:00 2015-12-16 13:00:00        B      1
2    1 2015-12-16 13:00:00 2015-12-16 20:00:00        C      0
3    2 2015-12-10 13:15:00 2015-12-12 13:45:00        B      1
4    2 2015-12-12 13:45:00 2015-12-12 19:45:00        A      0
5    3 2015-12-15 07:45:00 2015-12-15 18:45:00        A      1
6    3 2015-12-15 18:45:00 2015-12-18 07:15:00        D      1
7    3 2015-12-18 07:15:00 2015-12-19 10:45:00        C      1
8    3 2015-12-19 10:45:00 2015-12-20 09:00:00        H      0
9    4 2015-12-09 10:45:00 2015-12-13 12:20:00        E      1
10   4 2015-12-13 12:20:00 2015-12-13 18:20:00        A      1
11   4 2015-12-13 18:20:00 2015-12-13 23:40:00        A      1
12   4 2015-12-13 23:40:00 2015-12-16 08:00:00        B      0
13   5 2015-12-07 08:00:00 2015-12-13 12:25:00        H      0

И просто для полноты:

df.groupby(df.start.dt.date)['count'].sum()
start
2015-12-07    0
2015-12-09    1
2015-12-10    1
2015-12-12    0
2015-12-13    2
2015-12-14    1
2015-12-15    3
2015-12-16    0
2015-12-18    1
2015-12-19    0
...