我已经加载了一个带有JSON文件的S3存储桶,并将其解析/将其放到PANDAS DataFrame中。现在,我有一个带有175列的数据框,其中包含4列,其中包含个人身份信息。
我正在寻找一个快速解决方案,将这些列(名称& adress)匿名。我需要保留倍数的信息,以便如果发生多次同一人的名称或地址具有相同的哈希。
我可以使用熊猫或其他一些软件包中的现有功能吗?
使用Categorical
是一种有效的方法 - 主要警告是编号将仅基于数据中的排序,因此如果此编号为止,则需要一些护理方案需要在多个列/数据集中使用。
df = pd.DataFrame({'ssn': [1, 2, 3, 999, 10, 1]})
df['ssn_anon'] = df['ssn'].astype('category').cat.codes
df
Out[38]:
ssn ssn_anon
0 1 0
1 2 1
2 3 2
3 999 4
4 10 3
5 1 0
您可以从pandas
ngroup
或factorize
df.groupby('ssn').ngroup()
Out[25]:
0 0
1 1
2 2
3 4
4 3
5 0
dtype: int64
pd.factorize(df.ssn)[0]
Out[26]: array([0, 1, 2, 3, 4, 0], dtype=int64)
在Sklearn,如果您正在做ML,我会推荐这种方法
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(df.ssn).transform(df.ssn)
Out[31]: array([0, 1, 2, 4, 3, 0], dtype=int64)
您似乎正在寻找一种加密数据帧中字符串的方法。有一堆Python加密库,例如密码
如何使用它非常简单,只需将其应用于每个元素即可。
import pandas as pd
from cryptography.fernet import Fernet
df =pd.DataFrame([{'a':'a','b':'b'}, {'a':'a','b':'c'}])
f = Fernet('password')
res = df.applymap(lambda x: f.encrypt(byte(x, 'utf-8'))
# Decrypt
res.applymap(lambda x: f.decrypt(x))
这可能是安全性的最佳方法,但它会产生一个长字节/字符串,并且很难看。
# 'a' -> b'gAAAAABaRQZYMjB7wh-_kD-VmFKn2zXajMRUWSAeridW3GJrwyebcDSpqyFGJsCEcRcf68ylQMC83G7dyqoHKUHtjskEtne8Fw=='
另一种简单的方法,因此解决您的问题是创建一个函数,该函数将键映射到一个值并在存在新键的情况下创建新值。
mapper = {}
def encode(string):
if x not in mapper:
# This part can be changed with anything really
# Such as mapper[x]=randint(-10**10,10**10)
# Just ensure it would not repeat
mapper[x] = len(mapper)+1
return mapper[x]
res = df.applymap(encode)
听起来有点像您希望能够通过在某处维护键来扭转过程。如果您的用例允许,我建议用有效,可读和不可逆的占位符替换所有值。
约翰>马克
21 Hammersmith Grove RD> 48 Brewer Street
这对于为远程开发人员等生成可用的测试数据非常有用。您可以使用Faker自己生成替换值。如果您想在数据中维护一些实用程序,即"将所有地址替换为2英里内的其他地址",则可以使用我正在使用的API,称为Anon AI。我们从S3存储桶中解析JSON,自动找到所有PII(包括在自由文本字段中),并根据您的规格替换为占位符。如果需要,我们可以保持一致性和可逆性,如果您要保留不断增长的数据集的"实时"匿名版本,这将是最有用的。我们目前正在使用Beta,所以让我知道您是否有兴趣测试它。