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

#python #pandas

#python #pandas

Вопрос:

Я хотел бы создать уникальные идентификаторы для значений, которые являются дубликатами. Значения, которые являются дубликатами, равны только 0. Идея состоит в том, чтобы преобразовать каждый ноль в ноль плюс его позицию (0 1 для первой строки, 0 2 для второй строки и т.д.). Однако проблема в том, что столбец также имеет другие не повторяющиеся значения.

Я написал эту строку кода, чтобы попытаться преобразовать нулевые значения, как указано, но я получаю это сообщение об ошибке

Ошибка типа: ufunc ‘add’ не содержал цикла с сигнатурами, соответствующими типам dtype(‘

Вот мой код

 seller_customer['customer_id'] = np.where(seller_customer['customer_id']==0, seller_customer['customer_id']   seller_customer.groupby(['customer_id']).cumcount().replace('0',''))
  

Вот пример моих данных

 {0: '7e468d618e16c6e1373fb2c4a522c969',
 1: '1c14a115bead8a332738c5d7675cca8c',
 2: '434dee65d973593dbb8461ba38202798',
 3: '4bbeac9d9a22f0628ba712b90862df28',
 4: '578d5098cbbe40771e1229fea98ccafd',
 5:  0,
 6:  0,
 7:  0}
  

Комментарии:

1. Интересно. Возможно, вам нужно написать функцию Python

Ответ №1:

Если я правильно понимаю, вы можете просто присвоить значения диапазона тем id , которые 0 :

 df.loc[df['id']==0, 'id'] = np.arange((df['id']==0).sum())   1

print(df)
  

Вывод:

                                  id
0  7e468d618e16c6e1373fb2c4a522c969
1  1c14a115bead8a332738c5d7675cca8c
2  434dee65d973593dbb8461ba38202798
3  4bbeac9d9a22f0628ba712b90862df28
4  578d5098cbbe40771e1229fea98ccafd
5                                 1
6                                 2
7                                 3
  

Или более короткий, но немного медленный:

 df.loc[df['id']==0, 'id'] = (df['id']==0).cumsum()
  

Ответ №2:

Вы можете сделать что-то вроде этого:

     from pandas.util import hash_pandas_object
    import numpy as np
    df.x = np.where(df.x == 0, hash_pandas_object(df.x), df.x)
    df
  

Вывод:

                                       x
    0  7e468d618e16c6e1373fb2c4a522c969
    1  1c14a115bead8a332738c5d7675cca8c
    2  434dee65d973593dbb8461ba38202798
    3  4bbeac9d9a22f0628ba712b90862df28
    4  578d5098cbbe40771e1229fea98ccafd
    5                593769213749726025
    6              14559158595676751865
    7               4575103004772269825
  

Они не будут последовательными, как индекс, но они будут уникальными (почти наверняка, если вы не столкнетесь с коллизией хэшей)