Давайте попробуем groupby
и cumcount
:
df['is_new'] = df.groupby('email').cumcount().astype(bool).astype(int)
Или,
df['is_new'] = df.groupby('email').cumcount().ne(0).astype(int)
df
email is_new col_n
0 a@a 0 z
1 a@a 1 x
2 b@b 0 y
Детали
cumcount
возвращает увеличивающееся количество для каждого элемента в строке:
df2 = pd.concat([df] * 2, ignore_index=True).sort_values('email')
df2.groupby('email').cumcount()
0 0
1 1
3 2
4 3
2 0
5 1
dtype: int64
Это только типичный пример, но число может быть больше 1. Я конвертирую все значения> 0 в 1, используя любую из двух альтернатив:
df2.groupby('email').cumcount().ne(0).astype(int)
# df2.groupby('email').cumcount().astype(bool).astype(int)
0 0
1 1
3 1
4 1
2 0
5 1
dtype: int64