Вы можете использовать следующее.В следующей реализации дубликаты идентификаторов в исходном идентификаторе получат те же идентификаторы.Реализация основана на удалении дубликатов из столбца и назначении различного номера каждому уникальному идентификатору для формирования идентификаторов enw.Эти новые идентификаторы затем объединяются в исходный набор данных
import numpy as np
import pandas as pd
from time import time
num_rows = 119953
input_data = np.random.randint(1199531, size=(num_rows,1))
data = pd.DataFrame(input_data)
data.columns = ["ID_orig"]
data2 = pd.DataFrame(input_data)
data2.columns = ["ID_orig"]
t0 = time()
j=0
for i in range(0,num_rows-1):
if data.ID_orig[i]==data.ID_orig[i+1]:
data.ID_orig[i] = j
else:
data.ID_orig[i] = j
j=j+1
t1 = time()
id_new = data2.loc[:,"ID_orig"].drop_duplicates().reset_index().drop("index", axis=1)
id_new.reset_index(inplace=True)
id_new.columns = ["id_new"] + id_new.columns[1:].values.tolist()
data2 = data2.merge(id_new, on="ID_orig")
t2 = time()
print("Previous: ", round(t1-t0, 2), " seconds")
print("Current : ", round(t2-t1, 2), " seconds")
. Вывод программы, использующей только 119 тыс. Строк, составляет
Previous: 12.16 seconds
Current : 0.06 seconds
Разница во времени выполнения увеличивается еще больше по мере увеличения количества строк.увеличены.
РЕДАКТИРОВАТЬ Используя то же количество строк:
>>> print("Previous: ", round(t1-t0, 2))
Previous: 11.7
>>> print("Current : ", round(t2-t1, 2))
Current : 0.06
>>> print("jezrael's answer : ", round(t3-t2, 2))
jezrael's answer : 0.02