Как применить накопительную функцию агрегирования с группой по Pandas? - PullRequest
0 голосов
/ 24 января 2020

У меня есть этот фрейм данных

df1 = pd.DataFrame({'A': ['A0', 'A0', 'A1', 'A1','A0', 'A0', 'A1', 'A1', 'A0', 'A0', 'A1', 'A1'],
                        'B': [1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11],
                        'C': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
                        'i': [1, 1, 1, 1,2, 2, 2, 2, 3, 3, 3, 3]},
                      )

     A   B   C  i
0   A0   1   0  1
1   A0   2   1  1
2   A1   3   2  1
3   A1   3   3  1
4   A0   4   4  2
5   A0   5   5  2
6   A1   6   6  2
7   A1   7   7  2
8   A0   8   8  3
9   A0   9   9  3
10  A1  10  10  3
11  A1  11  11  3

Я хотел сгруппировать по A и i:

df1.set_index(['A', 'i'], inplace=True)
df1.groupby(df1.index).sum()

          B   C
(A0, 1)   3   1
(A0, 2)   9   9
(A0, 3)  17  17
(A1, 1)   6   5
(A1, 2)  13  13
(A1, 3)  21  21

Но я хочу, чтобы результат (A0,2) был сумма (A0,1) и (A0,2), а (A0,3) - сумма (A0,1), (A0,2) и (A0,3) и то же самое с A1, я знаю, что могу сделать это с помощью oop но я ищу лучшее решение, так как мой DataFrame больше этого. Таблица результатов, которую я хочу, это

          B   C
(A0, 1)   3   1
(A0, 2)  12  10
(A0, 3)  29  27
(A1, 1)   6   5
(A1, 2)  19  18
(A1, 3)  40  39

Ответы [ 2 ]

2 голосов
/ 24 января 2020

Использование Groupby.cumsum без df1.set_index(['A', 'i'], inplace=True):

new_df = df1.groupby(['A','i']).sum().groupby(level = 0).cumsum()
#not need set_index
#df1.set_index(['A','i']).groupby(['A','i']).sum().groupby(level = 
new_df.index = [*new_df.index] #for expected output
print(new_df)
          B   C
(A0, 1)   3   1
(A0, 2)  12  10
(A0, 3)  29  27
(A1, 1)   6   5
(A1, 2)  19  18
(A1, 3)  40  39
1 голос
/ 24 января 2020

Сводка: используйте функцию группировки и совокупную сумму для столбцов B и C. следующий шаг - сгруппировать во второй раз, только со столбцом A и совокупной суммой для столбцов B и C. Агрегация сводит групповые значения к одной точке. Группировка с использованием только столбца A снимает ограничение и позволяет кумуляции получить желаемый результат.

 (df1.groupby(['A','i'])
.agg({'B':'sum','C':'sum'})
.groupby(['A'])['B','C'].agg('cumsum'))

            B   C
  A i       
 A0 1   3   1
    2   12  10
    3   29  27
A1  1   6   5
    2   19  18
    3   40  39
...