Как присвоить уникальный идентификатор последовательности повторяющихся значений столбцов в фрейме данных pandas?

#python #pandas #dataframe

Вопрос:

У меня есть фрейм данных, который называется dfA,

 ID Chronological Label  1 1 None  2 0 ONPEAPLFPH  3 0 JFECJGSQNS  4 1 None  5 1 None  6 0 MGMELTIVTJ  7 1 None  8 1 None  9 1 None   

Я хочу присвоить unique_id столбцу Chronological значение a таким образом, чтобы каждое последующее повторяющееся значение имело «общее» unique_id . То есть я хочу получить следующий желаемый результат,

 ID Chronological Label unique_id  1 1 None 1 2 0 ONPEAPLFPH 2 3 0 JFECJGSQNS 3 4 1 None 4 5 1 None 4 6 0 MGMELTIVTJ 5  7 1 None 6 8 1 None 6 9 1 None 6  

Я попытался использовать невекторизованное решение с использованием for-loop, но оно действительно медленное,

 starting_index = 0 unique_id = 1 dfs = [] for cL in dfA['Label'].unique():  if cL != "None":  current_index = dfA[dfA['Label']==cL].index.values[0]  sliced_df = dfA.iloc[starting_index:current_index 1, :]  sliced_df_ = sliced_df.copy()  if len(sliced_df_)gt;=1:  sliced_df_['unique_id'] = unique_id  starting_index = current_index  unique_id  = 1  dfs.append(sliced_df_) df_concat = pd.concat(dfs, axis=0)  

Есть ли более эффективный способ решить эту проблему?

Ответ №1:

Попробуй это:

 df['unique_id'] = (df['Chronological'].eq(0) |   (df['Chronological'] != df['Chronological'].shift())  ).cumsum()  

Выход:

 ID Chronological Label unique_id 0 1 1 None 1 1 2 0 ONPEAPLFPH 2 2 3 0 JFECJGSQNS 3 3 4 1 None 4 4 5 1 None 4 5 6 0 MGMELTIVTJ 5 6 7 1 None 6 7 8 1 None 6 8 9 1 None 6