найти самые ранние и самые поздние даты между двумя столбцами - PullRequest
0 голосов
/ 15 января 2019

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

    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

Я хотел найти id_start_date и id_end_date для каждого идентификатора.

В приведенном выше примере есть даты начала и окончания каждой строки. Я хочу иметь два новых столбца id_start_date и id_end_date. В столбце id_start_date я хочу найти самую раннюю дату в столбце начала, специфичную для каждого идентификатора. Это просто. Сначала я могу отсортировать данные на основе идентификатора и начала, затем я могу просто выбрать первую дату начала в каждом идентификаторе или сделать группирование по идентификатору, а затем использовать функцию агрегирования, чтобы найти минимальную дату в столбце начала. Для id_end_date я могу сделать то же самое. Я могу группировать на основе идентификатора и использовать статистическую функцию, чтобы найти максимальную дату в столбце финиша.

df1 = df.sort_values(['id','start'],ascending=True)
gp = df1.groupby('id')
gp_out = gp.agg({'start': {'mindate': np.min}, 'finish': {'maxdate': np.max}})

когда я печатаю gp_out, он показывает правильные даты, но как бы я записал их обратно в исходный кадр данных df. Я ожидаю следующего:

id  start   finish  location id_start_date id_end_date
0   1   2015-12-14 16:44:00 2015-12-15 18:00:00 A 2015-12-14 16:44:00 2015-12-16 20:00:00
1   1   2015-12-15 18:00:00 2015-12-16 13:00:00 B 2015-12-14 16:44:00 2015-12-16 20:00:00
2   1   2015-12-16 13:00:00 2015-12-16 20:00:00 C 2015-12-14 16:44:00 2015-12-16 20:00:00
3   2   2015-12-10 13:15:00 2015-12-12 13:45:00 B 2015-12-10 13:15:00 2015-12-12 19:45:00
4   2   2015-12-12 13:45:00 2015-12-12 19:45:00 A 2015-12-10 13:15:00 2015-12-12 19:45:00
5   3   2015-12-15 07:45:00 2015-12-15 18:45:00 A 2015-12-15 07:45:00 2015-12-20 09:00:00
6   3   2015-12-15 18:45:00 2015-12-18 07:15:00 D 2015-12-15 07:45:00 2015-12-20 09:00:00
7   3   2015-12-18 07:15:00 2015-12-19 10:45:00 C 2015-12-15 07:45:00 2015-12-20 09:00:00
8   3   2015-12-19 10:45:00 2015-12-20 09:00:00 H 2015-12-15 07:45:00 2015-12-20 09:00:00

Как мне получить последние два столбца в исходном фрейме данных df?

1 Ответ

0 голосов
/ 15 января 2019

Использование transform

g=df.groupby('id')
df['id_start_date']=g['start'].transform('min')
df['id_end_date']=g['finish'].transform('max')
...