Используйте groupby
и ngroup
, чтобы получить уникальные идентификаторы для каждого текущего идентификатора. Затем вы можете объединить свой префикс (несколько способов сделать это).
df
col
0 56-34567
1 56-25767
2 56-24777
3 56-23987
4 56-23987
5 56-23987
6 56-34567
# df.groupby('col', sort=False).ngroup().add(1).astype(str).radd('ID_')
df.groupby('col', sort=False).ngroup().add(1).map('ID_{}'.format)
0 ID_1
1 ID_2
2 ID_3
3 ID_4
4 ID_4
5 ID_4
6 ID_1
dtype: object
Где ngroup
возвращает,
df.groupby('col', sort=False).ngroup()
0 0
1 1
2 2
3 3
4 3
5 3
6 0
dtype: int64
Здесь важен вызов sort=False
, потому что мы хотим, чтобы порядок вывода был идентичным вводу.
Дополнительные параметры, однако не могут гарантировать такой же порядок заказа. Один метод использует pd.factorize
:
np.char.add('ID_', (pd.factorize(df['col'])[0] + 1).astype(str))
# array(['ID_1', 'ID_2', 'ID_3', 'ID_4', 'ID_4', 'ID_4', 'ID_1'],
# dtype='<U24')
Возвращается массив, вы можете присвоить результат обратно,
df.assign(col=np.char.add('ID_', (pd.factorize(df['col'])[0] + 1).astype(str)))
col
0 ID_1
1 ID_2
2 ID_3
3 ID_4
4 ID_4
5 ID_4
6 ID_1