Я перестроил ваши данные следующим образом:
import pandas as pd
df = pd.DataFrame(
{'col1': ['Name_A'] * 5 + ['Name_B'] * 4,
'col2': ['date{}'.format(x) for x in list(range(1,10,1))],
'col3': [1,0,1,1,1,1,1,0,1]})
Для предлагаемой вами группы я предпочитаю использовать itertools.groupby
вместо pd.groupby
, чтобы я мог явно указать два условиячто вы указали (изменение имени и 0 в столбце значений):
from itertools import groupby
groups = []
uniquekeys = []
for k, g in groupby(df.iterrows(),
lambda row: (row[1]['col1'], row[1]['col3'] == 0)):
groups.append(list(g))
uniquekeys.append(k)
Теперь, когда существуют правильные группы, остается только выполнить итерацию, а затем вычислить совокупную сумму:
cumsum = pd.concat([pd.Series([y[1]['col3'] for y in x]).cumsum() for x in groups])
df['cumsum'] = list(cumsum)
Результат:
col1 col2 col3 cumsum
0 Name_A date1 1 1
1 Name_A date2 0 0
2 Name_A date3 1 1
3 Name_A date4 1 2
4 Name_A date5 1 3
5 Name_B date6 1 1
6 Name_B date7 1 2
7 Name_B date8 0 0
8 Name_B date9 1 1
Для справки см. Хорошее объяснение о itertools.groupby
здесь .