Вот простой способ получения последовательных внутренних идентификаторов:
# setup environment
import pandas as pd
import numpy as np
np.random.seed(13)
df = pd.DataFrame({'col': [1, 0, 0, 1, 1, 1, 1, 0, 0, 1]})
# create masks for use in later updates
msk_one = df['col'] == 1
msk_first = df['col'] != df['col'].shift()
# mark each time a new series of 1s begins with a True
df['ID'] = msk_one & msk_first
# add up the Trues to get sequential ids
df['ID'] = df['ID'].cumsum()
# drop ids on the False rows
df.loc[~msk_one, 'ID'] = 0
print(df)
# col ID
# 0 1 1
# 1 0 0
# 2 0 0
# 3 1 2
# 4 1 2
# 5 1 2
# 6 1 2
# 7 0 0
# 8 0 0
# 9 1 3
Чтобы преобразовать эти последовательные идентификаторы в случайные идентификаторы, вы можете сделать это:
# create conversion dict mapping from sequential to random IDS
ids = df['ID'].unique()
# ignore zeros because we want to manually map them to themselves
ids = ids[ids != 0]
random_ids = np.random.choice(ids, len(ids), replace=False)
sequential_to_random = {non_random_id: random_id for non_random_id, random_id in zip(ids, random_ids)}
sequential_to_random[0] = 0
# convert the IDs to random ints
df['ID'] = df['ID'].apply(lambda x: sequential_to_random[x])
print(df)
# col ID
# 0 1 2
# 1 0 0
# 2 0 0
# 3 1 1
# 4 1 1
# 5 1 1
# 6 1 1
# 7 0 0
# 8 0 0
# 9 1 3
Надеюсь, это поможет!