我有一个df,其中有一列如下所示:
id
11
22
22
333
33
333
此列是敏感数据。我想用任何随机数替换每个值,但在相同的ID中,每个随机数都应该保持相同的数字。
例如,我想屏蔽列中的数据,如下所示:
id
123
987
987
456
00
456
请注意,相同的ID具有相同的值。我该如何做到这一点?我有成千上万的身份证。
我建议这样做:
from random import randint
df['id_rand'] = df.groupby('id')['id'].transform(lambda x: randint(1,1000))
>>> df
'''
id id_rand
0 11 833
1 22 577
2 22 577
3 333 101
4 33 723
5 333 101
这里有两个选项,用于生成分类(非随机,id2
(或每个原始ID生成唯一随机(id3
(。在这两种情况下,我们可以使用pandas.factorize
(或者可替换地unique
或pandas.Categorical
(。
# enumerated categorical
df['id2'] = pd.factorize(df['id'])[0]
# random categorical
import numpy as np
s,ids = pd.factorize(df['id'])
d = dict(zip(ids, np.random.choice(range(1000), size=len(ids), replace=False)))
df['id3'] = df['id'].map(d)
# alternative 1
ids = df['id'].unique()
d = dict(zip(ids, np.random.choice(range(1000), size=len(ids), replace=False)))
df['id3'] = df['id'].map(d)
# alternative 2
df['id3'] = pd.Categorical(df['id'])
new_ids = np.random.choice(range(1000), size=len(df['id3'].cat.categories), replace=False)
df['id3'] = df['id3'].cat.rename_categories(new_ids)
输出:
id id2 id3
0 11 0 395
1 22 1 428
2 22 1 428
3 333 2 528
4 33 3 783
5 333 2 528