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

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

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

вкладчик - уплаченная сумма
Эрик - 10
откровенный - 28
Джон - 49
откровенный - 77
Барбара - 31

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

вкладчик - уплаченная сумма
человек1 - 10
человек2 - 28
человек3 - 49
человек2 - 77
человек4 - 31

Поэтому сначала я суммировал столбец имени, чтобы имена были привязаны к уникальному индексу, и я использую этот индекс для числа после слова "человек".

Так что теперь я застрял в той части, как я могу пройти через мой data.name в столбце и просмотрите итоговый фрейм данных для индекса и замените фактическое имя, например, на "person3".

мой код пока

counter = 0
for names in data.contributor:
    if names == summarize.contributor[counter]:
         print(summarize.contributor[counter])
         data.contributor.replace(summarize.contributor[counter], "Person %d" % counter)
    counter = counter + 1

Я думал, чтобы поместить имена в список + индекс, но я думаю, что есть быстрый путь. Поиск "Энтони" был просто тестом, чтобы увидеть, работает ли мой код.

3 ответа

Решение

Может быть, попытаться создать фрейм данных под названием "индекс" для этой операции и сохранить уникальный 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']]

Я думаю, что более быстрое решение это использовать 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
labels, uniques =  pd.factorize(df['name'])
labels = ['person_'+str(l) for l in labels]
df['contributor_anonymized'] = labels

Здорово, это сработало. Я использовал часть вашего кода в моем, и вместе он дал правильный вывод:

counter = 0
for names in data.contributor:
    if names == summarize.contributor[counter]:
        print(summarize.contributor[counter])
        data['contributor_anonymized'] = data['contributor'].apply(lambda x : 'Person' + str(index[index.name == x].index[0] + 1))
        counter = counter + 1
Другие вопросы по тегам