Анонимизация данных/замена имен

Обычно я анонимизирую свои данные, используя хеш-библиотеку и функцию .apply(hash).

Теперь я пробую новый подход, представьте, что мне нужно следовать df под названием «данные»:

df = pd.DataFrame({'contributor':['eric', 'frank', 'john', 'frank', 'barbara'],
                   'amount payed':[10,28,49,77,31]})

  contributor  amount payed
0        eric            10
1       frank            28
2        john            49
3       frank            77
4     barbara            31

Который я хочу анонимизировать, превратив все имена в person1, person2 и т. д., например:

output = pd.DataFrame({'contributor':['person1', 'person2', 'person3', 'person2', 'person4'],
                       'amount payed':[10,28,49,77,31]})

  contributor  amount payed
0     person1            10
1     person2            28
2     person3            49
3     person2            77
4     person4            31

Итак, сначала я суммировал столбец name, чтобы имена были привязаны к уникальному индексу, и я мог использовать этот индекс для числа после «человека».


person Erfan    schedule 15.03.2018    source источник


Ответы (2)


Я думаю, что более быстрым решением является использование factorize для уникальных значений, добавить 1, преобразовать в Series и string и добавить перед строкой Person:

df['contributor'] = 'Person' + pd.Series(pd.factorize(df['contributor'])[0] + 1).astype(str)
print (df)
  contributor  amount payed
0     Person1            10
1     Person2            28
2     Person3            49
3     Person2            77
4     Person4            31
person jezrael    schedule 16.03.2018
comment
Это на самом деле очень полезный и быстрый метод. Спасибо, что познакомили меня с факторизацией, я никогда не использовал ее раньше! - person Erfan; 16.03.2018
comment
@Erfan - Да, пожалуйста! И только один ответ должен быть принят;) - person jezrael; 16.03.2018
comment
Красивый! Большое спасибо! - person Michael Dorner; 26.11.2020

Может быть, попытаться создать фрейм данных под названием «индекс» для этой операции и сохранить в нем уникальные значения name?

Затем создайте маски с уникальными индексами имен и объедините полученный фрейм данных indexс data.

index = pd.DataFrame()
index['name'] = df['name'].unique()
index['mask'] = index['name'].apply(lambda x : 'person' + 
str(index[index.name == x].index[0] + 1))

data.merge(index, how='left')[['mask', 'amount']]
person Cem    schedule 15.03.2018