Получите полосу в группе панд

#python #pandas

Вопрос:

Я ищу метод для вычисления полос групп. Для каждой группы, если предыдущий «Результат» совпадает с текущим «Результатом», то эти два результата суммируются вместе. Если предыдущий «Результат» отличается от текущего «Результата» или если предыдущего результата нет, то он должен вернуть текущий результат.

Любая помощь будет признательна

 df_input = pd.DataFrame() df_input['Name'] = ['A','B','A','A','C','C','B','A','B','C'] df_input['Result'] = [1,1,-1,-1,1,1,-1,1,-1,1]  df_output = pd.DataFrame() df_output['Name'] = ['A','B','A','A','C','C','B','A','B','C'] df_output['Result'] = [1,1,-1,-1,1,1,-1,1,-1,1] df_output['Streak'] = [1,1,-1,-2,1,2,-1,1,-2,3]    

Ответ №1:

Сначала создайте групповую переменную, чтобы назначить группу каждому фрагменту последовательных одинаковых значений в каждом Name :

 g = df.Result.groupby(df.Name).transform(lambda x: x.diff().ne(0).cumsum()) g 0 1 1 1 2 2 3 2 4 1 5 1 6 2 7 3 8 2 9 1 Name: Result, dtype: int32  

Рассчитайте cumsum на основе Name групповой переменной и:

 df['Streak'] = df.Result.groupby([df.Name, g]).cumsum()  df  Name Result Streak 0 A 1 1 1 B 1 1 2 A -1 -1 3 A -1 -2 4 C 1 1 5 C 1 2 6 B -1 -1 7 A 1 1 8 B -1 -2 9 C 1 3