匿名化数据/替换名称
Anonymizing data / replacing names
通常我会使用 hashlib 和 .apply(hash) 函数来匿名化我的数据。
现在我正在尝试一种新方法,假设我必须遵循名为 'data':
的 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" 的数据框并在其中保留唯一的 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
s 并添加 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
通常我会使用 hashlib 和 .apply(hash) 函数来匿名化我的数据。
现在我正在尝试一种新方法,假设我必须遵循名为 'data':
的 dfdf = 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" 的数据框并在其中保留唯一的 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
s 并添加 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