通常我使用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
我的想法是把名字放在列表+索引中,但我想这是一个更快的方法。寻找安东尼'只是一个测试,看看我的代码是否正常工作。
答案 0 :(得分:4)
我认为更快的解决方案是使用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
答案 1 :(得分:0)
也许尝试为此操作创建一个名为“index”的数据框,并在其中保留唯一的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']]
答案 2 :(得分:0)
labels, uniques = pd.factorize(df['name'])
labels = ['person_'+str(l) for l in labels]
df['contributor_anonymized'] = labels