Еще один подход с категорией:
df['visit'] = df.groupby('id')['date'].transform(lambda x: pd.Categorical(x).codes)
Используйте xwininfo (1)