Создайте текущий итог с несколькими столбцами в Python

#python #pandas #numpy

Вопрос:

У меня есть набор данных, в котором я хотел бы суммировать несколько столбцов, а затем создать несколько столбцов с текущим итогом. Выходные данные должны быть сгруппированы по идентификатору и дате.

Данные

 id  date    t1  t2  total   start   curr_t2 curr_t2 
a   q1 22   4   1   5       50      25      20  
a   q2 22   1   1   2       50      25      20  
a   q3 22   0   0   0       50      25      20  
b   q1 22   5   5   10      100     30      40  
b   q2 22   2   2   4       100     30      70  
b   q3 22   3   4   7       100     30      70  
 

Желанный

 id  date    t1  t2  total   start   cur_t1  cur_t2  final   finalt1 finalt2
a   q1 22   4   1   5       50      25      20      55      29      21
a   q2 22   1   1   2       50      25      20      57      30      22
a   q3 22   0   0   0       50      25      20      57      30      22
b   q1 22   5   5   10      100     30      40      110     35      27
b   q2 22   2   2   4       100     30      70      114     37      29
b   q3 22   3   4   7       100     30      70      121     40      33


**Logic:**

sum the 'start' and 'total' column to create the 'final' column
however, final column is a running total, adding to the 'total' column.

EX.

start = 50 total = 5 so final = 55
then
the next row we have a total of 2 , so the final for the next row is 57 

Similar logic with the newly created: finalt1 and finalt2
 

и т.д.

Делающий

Я считаю, что мне нужно использовать функцию .cumsum, чтобы получить желаемый результат. Результат должен быть сгруппирован по идентификатору и дате

 out['final'] = out['final'].sub(out.groupby('id')['start'].cumsum())
 

Однако эти выходные данные не группируются по модулю и дате. Я все еще занимаюсь исследованиями, любое предложение приветствуется.

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

1. можете ли вы объяснить логику вычислений?

2. конечно, я обновлю сообщение

Ответ №1:

Попробуйте с

 df['final'] = df['start'].add(df.groupby('id')['total'].cumsum())
df['final1'] = df['t1'].add(df.groupby('id')['curr_t1'].cumsum())
df['final2'] = df['t2'].add(df.groupby('id')['curr_t2'].cumsum())
 

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

1. Привет @BENY, спасибо, первый итог работает, но для столбцов «финал1» и «финал2» он не принимает совокупную сумму , он работает только для этой первой строки. Я думаю, что для работы он должен быть сгруппирован как по «идентификатору», так и по «дате»?

2. хорошо, его просто нужно переставить, и он работает: df[‘final1’] = df[‘curr_t1’].добавить(df.groupby(‘id’) [‘t1’].cumsum())