Как насчет этого причудливого решения:
cols= df.columns[df.columns.str.contains(pat='nozzle_\d+$', regex=True)]
df.assign(**df.groupby('tank')[cols].agg(['cumsum'])\
.pipe(lambda x: x.set_axis(x.columns.map('_'.join), axis=1, inplace=False)))
Вывод:
tank nozzle_1 nozzle_2 nozzle_var nozzle_1_cumsum nozzle_2_cumsum
0 1 1 1 10 1 1
1 1 2 2 12 3 3
2 2 1 1 10 1 1
3 2 2 2 12 3 3
По шагам:
df_cumsum = df.groupby('tank')[cols].agg(['cumsum'])
df_cumsum.columns = df_cumsum.columns.map('_'.join)
pd.concat([df, df_cumsum], axis=1)
Вывод:
tank nozzle_1 nozzle_2 nozzle_var nozzle_1_cumsum nozzle_2_cumsum
0 1 1 1 10 1 1
1 1 2 2 12 3 3
2 2 1 1 10 1 1
3 2 2 2 12 3 3