Группа Python только по соседям

#python #dataframe #pandas-groupby

Вопрос:

У меня есть набор данных, состоящий из измерений, и мой фрейм данных выглядит так:

 ID VAL BS ERROR 0 0 0 0 1 1 0 1 2 1 0 1 3 0 0 0 4 11 10 1 5 10 10 0 6 12 10 2 7 11 10 1 8 9 10 -1 9 30 30 0 10 31 30 1 11 29 30 -1 12 10 10 0 13 9 10 -1 14 8 10 -2 15 11 10 1 16 0 0 0 17 1 0 1 18 2 0 2 19 9 10 -1 20 10 10 0  

Где VAL измеренное значение, BS является базовым(округляется до ближайших 10) и ERROR представляет собой разницу между измеренным значением и базой.

То, что я пытаюсь сделать, — это несколько сгруппировать по «БАЗОВОМУ» столбцу, но только для соседних строк.

Таким образом, результирующий набор данных будет выглядеть так (я также захочу рассчитать совокупную минимальную и максимальную ошибку для группы, но, думаю, это не будет проблемой)

В этом случае важно соблюдать порядок групп.

 ID BS MIN MAX 0 0 0 1 1 10 -1 2 2 30 -1 1 3 10 -2 1 4 0 0 2 5 10 -1 0  

Ответ №1:

Вы можете найти последовательные группы, подобные этой:

 df['GROUP'] = (df['BS']!=df['BS'].shift()).cumsum()  

Затем вы группируетесь по GROUP столбцу и агрегируете min и max:

 df.groupby(['GROUP', 'BS'])['ERROR'].agg(['min', 'max']).reset_index()  

Результат должен быть:

 GROUP BS min max 0 1 0 0 1 1 2 10 -1 2 2 3 30 -1 1 3 4 10 -2 1 4 5 0 0 2 5 6 10 -1 0  

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

1. Спасибо, это именно то, что я искал