множественная кумулятивная сумма на основе сгруппированных столбцов

avatar
Lynn
9 августа 2021 в 04:59
69
1
0

У меня есть набор данных, в котором я хотел бы суммировать два столбца, а затем выполнить вычитание, отображая кумулятивную сумму

Данные

id   date   t1  t2  total   start   cur_t1  cur_t2  final_o finaldb de_t1   de_t2
a    q122   4   1   5       50      25      20      55      21      1       1
a    q222   1   1   2       50      25      20      57      22      0       0
a    q322   0   0   0       50      25      20      57      22      5       5
b    q122   5   5   10      100     30      40      110     27      4       4
b    q222   2   2   4       100     30      70      114     29      5       1
b    q322   3   4   7       100     30      70      121     33      0       1

Желаемый

id date t1  t2  total   start   cur_t1  cur_t2  final_o finaldb de_t1   de_t2   finalt1
a  q122 4   1   5       50      25      20      55      21      1       1       28
a  q222 1   1   2       50      25      20      57      22      0       0       29
a  q322 0   0   0       50      25      20      57      22      5       5       24
b  q122 5   5   10      100     30      40      110     27      4       4       31
b  q222 2   2   4       100     30      70      114     29      5       1       28
b  q322 3   4   7       100     30      70      121     33      0       1       31

Логика

Create 'finalt1' column by summing 't1' and 'cur_t1' 
initially and then subtracting 'de_t1' cumulatively and grouping by 'id' and 'date'

Выполнение

df['finalt1'] = df['cur_t1'].add(df.groupby('id')['t1'].cumsum())

Я все еще изучаю, как кумулятивно вычитать столбец 'de_t1'. Любое предложение приветствуется

Источник
Anurag Dabas
9 августа 2021 в 05:11
0

Разве ваш ожидаемый результат неверен в соответствии с логикой? думаете это будет [28,26,20,31,27,33]?

Ответы (1)

avatar
mozway
9 августа 2021 в 05:06
1

Я не могу проверить прямо сейчас, но по логике:

(df['cur_t1'].add(df.groupby('id')['t1'].cumsum())
             .sub(df.groupby('id')['de_t1'].cumsum())
)

Примечательно, что была также возможность избежать группирования дважды (одновременно вычисляются обе совокупные суммы и вычисляется разница), но на самом деле это медленнее:

df['cur_t1'].add(df.groupby('id')[['de_t1', 't1']].cumsum().diff(axis=1)['t1'])