#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