#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())