Pandas 匿名化数据/替换名称

Pandas 匿名化数据/替换名称,pandas,hash,anonymize,Pandas,Hash,Anonymize,通常我使用hashlib和.apply(hash)函数来匿名化数据 现在我正在尝试一种新的方法,想象一下我必须遵循名为“数据”的df: df = pd.DataFrame({'contributor':['eric', 'frank', 'john', 'frank', 'barbara'], 'amount payed':[10,28,49,77,31]}) contributor amount payed 0 eric

通常我使用hashlib和.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”之后的数字

是否可以尝试为此操作创建一个名为“index”的数据框,并在其中保留唯一的
名称

然后生成具有唯一名称索引的掩码,并将生成的数据帧
索引
数据
合并

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']]

我认为更快的解决方案是使用唯一值,添加
1
,转换为
Series
string
s,并在
Person
string前加上前缀:

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