#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 . может быть, опечатка ?