Первый вариант - если вы хотите «объединить» все строки для каждой Имя в одиночную группу:
df['total'] = df.groupby('Name').apply(lambda grp:
(grp.DR - grp.CR).cumsum()).reset_index(level=0, drop=True)
Для ваших исходных данных результат будет:
Name DR CR total
303 B3 46.8 0.00 46.80
304 B3 45.2 0.00 92.00
395 BS1 0.0 10.37 -10.37
396 BS1 0.0 87.00 -97.37
397 C 0.0 482.10 -482.10
399 C 20.0 0.00 -462.10
Второй вариант - если любое изменение в Имя означает начало новой группы.
Предположим, что ваш DataFrame содержит:
Name DR CR
303 B3 46.8 0.00
304 B3 45.2 0.00
395 BS1 0.0 10.37
396 BS1 0.0 87.00
397 C 0.0 482.10
399 C 20.0 0.00
400 B3 53.0 8.00
401 B3 40.8 6.15
, а вторая группа B3 должна быть суммирована отдельно от первой группы:
df['total'] = df.groupby((df.Name != df.Name.shift()).cumsum())\
.apply(lambda grp: (grp.DR - grp.CR).cumsum()).reset_index(level=0, drop=True)
получение:
Name DR CR total
303 B3 46.8 0.00 46.80
304 B3 45.2 0.00 92.00
395 BS1 0.0 10.37 -10.37
396 BS1 0.0 87.00 -97.37
397 C 0.0 482.10 -482.10
399 C 20.0 0.00 -462.10
400 B3 53.0 8.00 45.00
401 B3 40.8 6.15 79.65
Как видите, вторая группа B3 суммируется отдельно.