Существует векторизованное решение с использованием groupby + apply:
Разбейте его на 2 строки, чтобы сделать его более понятным, но оно все еще немного запутано:
Чтение ваших данных:
s = '''Date ID Dummy
2017-10-01 1 0
2017-12-31 1 1
2017-12-31 2 1
2018-01-15 2 0
2018-01-25 1 0
2018-02-01 1 1
2018-02-02 1 0'''
df = pd.DataFrame.from_csv(io.StringIO(s), sep='\s+', index_col=None)
df['Date'] = pd.to_datetime(df['Date'])
Предлагаемое решение:
last_valid = lambda gdf: (gdf['Date'] - gdf['Date'].where(gdf['Dummy']==1, np.nan).ffill().shift(1))
df['Counter'] = df.groupby('ID').apply(last_valid).reset_index('ID', drop=True).dt.days.fillna(-1)
Вывод:
Date ID Dummy Counter
0 2017-10-01 1 0 -1.0
1 2017-12-31 1 1 -1.0
2 2017-12-31 2 1 -1.0
3 2018-01-15 2 0 15.0
4 2018-01-25 1 0 25.0
5 2018-02-01 1 1 32.0
6 2018-02-02 1 0 1.0