Как присвоить уникальный идентификатор последовательности записей

#python #pandas #dataframe

Вопрос:

У меня есть таблицы данных df ,

 ID MID TimeType Starttime Endtime next_Starttime  333429 7 NEB 2021-11-01 20:45:17 2021-11-01 20:45:44 2021-11-01 20:45:44  333430 7 AUF 2021-11-01 20:45:44 2021-11-01 21:00:00 2021-11-01 21:00:00  333476 7 AUF 2021-11-01 21:00:00 2021-11-01 21:03:36 2021-11-01 21:03:36  333477 7 NEB 2021-11-01 21:03:36 2021-11-01 21:11:43 2021-11-01 21:11:43  333502 7 AUF 2021-11-01 21:11:43 2021-11-01 21:11:44 2021-11-01 21:11:44  333511 7 AUF 2021-11-01 21:11:44 2021-11-01 21:25:01 2021-11-01 21:25:01  333553 7 AUF 2021-11-01 21:25:01 2021-11-01 21:40:01 2021-11-01 21:40:01   

Я хотел бы назначить уникальный идентификатор для столбца TimeType на основе последовательности повторений, чтобы желаемый результат выглядел следующим образом,

 ID MID TimeType Starttime Endtime next_Starttime unique_id  333429 7 NEB 2021-11-01 20:45:17 2021-11-01 20:45:44 2021-11-01 20:45:44 1 333430 7 AUF 2021-11-01 20:45:44 2021-11-01 21:00:00 2021-11-01 21:00:00 2 333476 7 AUF 2021-11-01 21:00:00 2021-11-01 21:03:36 2021-11-01 21:03:36 2 333477 7 NEB 2021-11-01 21:03:36 2021-11-01 21:11:43 2021-11-01 21:11:43 3 333502 7 AUF 2021-11-01 21:11:43 2021-11-01 21:11:44 2021-11-01 21:11:44 4 333511 7 AUF 2021-11-01 21:11:44 2021-11-01 21:25:01 2021-11-01 21:25:01 4 333553 7 AUF 2021-11-01 21:25:01 2021-11-01 21:40:01 2021-11-01 21:40:01 4  

Я пробовал использовать циклы for, но, исходя из размера фрейма данных, выполнение слишком медленное.

Ответ №1:

Вы можете использовать shift для сравнения последовательных строк и cumsum подсчета:

 df['unique_id'] = df['TimeType'].ne(df['TimeType'].shift()).cumsum()  

выход:

 ID MID TimeType Starttime Endtime next_Starttime unique_id 0 333429 7 NEB 2021-11-01 20:45:17 2021-11-01 20:45:44 2021-11-01 20:45:44 1 1 333430 7 AUF 2021-11-01 20:45:44 2021-11-01 21:00:00 2021-11-01 21:00:00 2 2 333476 7 AUF 2021-11-01 21:00:00 2021-11-01 21:03:36 2021-11-01 21:03:36 2 3 333477 7 NEB 2021-11-01 21:03:36 2021-11-01 21:11:43 2021-11-01 21:11:43 3 4 333502 7 AUF 2021-11-01 21:11:43 2021-11-01 21:11:44 2021-11-01 21:11:44 4 5 333511 7 AUF 2021-11-01 21:11:44 2021-11-01 21:25:01 2021-11-01 21:25:01 4 6 333553 7 AUF 2021-11-01 21:25:01 2021-11-01 21:40:01 2021-11-01 21:40:01 4  

Ответ №2:

 import pdrle  pdrle.get_id(df.TimeType) # 0 0 # 1 1 # 2 1 # 3 2 # 4 3 # 5 3 # 6 3 # dtype: int64  

Ответ №3:

Вы можете сделать

 df['uni_id'] = df['TimeType'].ne(df['TimeType']).cumsum()  

Комментарии:

1. Я думаю, ты забыл shift 😉