Сначала замените все другие значения после первых 1
на 1
, поэтому возможно использование GroupBy.cumsum
:
df = pd.DataFrame({'c':['a']*3 + ['b']*3+ ['c']*3, 'v':[1,0,0,0,1,0,0,0,1]})
s = df.groupby('c')['v'].cumsum()
df['new'] = s.where(s.eq(0), 1).groupby(df['c']).cumsum()
print (df)
c v new
0 a 1 1
1 a 0 2
2 a 0 3
3 b 0 0
4 b 1 1
5 b 0 2
6 c 0 0
7 c 0 0
8 c 1 1
Другое решение - заменить все, а не 1
значения к пропущенным значениям и прямое заполнение 1
для групп, затем сначала пропущенные значения заменяются на 0
, поэтому кумулятивная сумма также отлично работает:
s = df['v'].where(df['v'].eq(1)).groupby(df['c']).ffill().fillna(0).astype(int)
df['new'] = s.groupby(df['c']).cumsum()