Подсчитайте количество определенного условного события для уникального идентификатора в скользящем окне с течением времени с пандами

#python #pandas #rolling-computation

Вопрос:

У меня есть первый кадр данных, и я хотел бы получить второй с новым счетчиком столбцов.

Логика: используя скользящее окно (пример df.rolling(‘1 минута’).agg(лямбда …)), для каждого уникального идентификатора в окне столбец «счетчик» равен 1, если «полный» или «частичный» найден хотя бы один раз. Как только он будет найден в первый раз, мы напишем 1, и нам не нужно будет проверять дальше в окне.

Например, ниже идентификатор «2» имел два раза «частичное событие» в одном и том же окне, поэтому счетчик равен 0.

Счетчик всегда равен 0 или 1.

Обратите внимание, что в событии столбца есть и другие события, отличные от «полного» и «частичного», которые мы должны игнорировать.

 timestamp id event  2021-10-26 10:00:00.000 1 full  2021-10-26 10:00:01.000 2 partial  2021-10-26 10:00:03.090 3 full  2021-10-26 10:00:05.090 2 partial  2021-10-26 10:00:05.590 4 event_z 2021-10-26 10:00:05.690 4 event_z 2021-10-26 10:00:05.790 4 event_b   timestamp id event counter 2021-10-26 10:00:00.000 1 full 1 2021-10-26 10:00:01.000 2 partial 1 2021-10-26 10:00:03.090 3 full 1 2021-10-26 10:00:05.090 2 partial 0 2021-10-26 10:00:05.090 4 event_z 0 2021-10-26 10:00:05.090 4 event_z 0 2021-10-26 10:00:05.090 4 event_b 0  df['counter'].rolling('1min').agg(lambda ... ?)  

Мне трудно написать сложную формулу в виде лямбда-функции, может быть, лучше разделить проблему на две части и создать промежуточные столбцы ?

заранее спасибо!

Ответ №1:

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

 m = df['event'].isin(['full','partial']) df.loc[m, 'new'] = pd.factorize(df.loc[m, 'event'])[0]  def f(x):  a = x.duplicated() amp; x.notna()  return ~a.any() df = df.groupby('id')['new'].rolling('1min').apply(f).fillna(0).reset_index(level=0).sort_index() print (df)  id new timestamp  2021-10-26 10:00:00.000 1 1.0 2021-10-26 10:00:01.000 2 1.0 2021-10-26 10:00:03.090 3 1.0 2021-10-26 10:00:05.090 2 0.0 2021-10-26 10:00:05.590 4 0.0 2021-10-26 10:00:05.690 4 0.0 2021-10-26 10:00:05.790 4 0.0  

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

1. Большое спасибо за предложение, Израэль. Я думаю, что это может не сработать, так как существуют и другие типы событий, отличные от «частичных» и «полных». Я прав ?

2. @LaGabriella — хммм, тогда это означает, что вы не понимаете свою функцию, можете ли вы добавить больше строк в примеры данных, чтобы объяснить, почему мое решение не удалось?

3. @LaGabriella — другими словами — нужно проверить, только ли full дублируются или partial затем установить 0 еще 1 ?

4. Я только что закончил свой вопрос. Моя вина, что это не было четко указано. столбец «счетчик» равен 1, если «полный» или «частичный» найден хотя бы один раз. Как только он будет найден в первый раз, мы напишем 1, и нам не нужно будет проверять дальше в окне.

5. еще раз спасибо вам ! Я попробую это сделать. что касается последней таблицы, два последних значения для id2 должны быть 0, а не 1 . может быть, опечатка ?