匿名化数据/替换名称

时间:2018-03-15 20:57:15

标签: pandas hash anonymize

通常我使用hashlib并使用.apply(hash)函数来匿名化我的数据。

现在我尝试一种新方法,想象一下我必须关注df,称为'数据':

撰稿人 - 支付金额
eric - 10
坦诚 - 28
约翰 - 49
坦率地说 - 77
巴巴拉 - 31

我希望通过将名称全部转换为' person1',' person2'来匿名化。等,像这样:

撰稿人 - 支付金额
person1 - 10
person2 - 28
person3 - 49
person2 - 77
person4 - 31

所以我的第一个是总结名称列,因此这些名称会附加到一个唯一的索引上,并且我会在“人物”之后使用该索引作为数字'。

所以现在我坚持这个部分我如何遍历我的data.name列并查看索引的汇总数据框并用'#3;#3;'替换实际名称。例如。

到目前为止我的代码

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 个答案:

答案 0 :(得分:4)

我认为更快的解决方案是使用factorize获取唯一值,添加1,转换为Seriesstring并添加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

答案 1 :(得分:0)

也许尝试为此操作创建一个名为“index”的数据框,并在其中保留唯一的name值?

然后生成具有唯一名称索引的掩码,并将结果数据框indexdata合并。

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

答案 2 :(得分:0)

labels, uniques =  pd.factorize(df['name'])
labels = ['person_'+str(l) for l in labels]
df['contributor_anonymized'] = labels