我有一个 df,其列如下所示:
id
11
22
22
333
33
333
此列是敏感数据。我想用任何随机数替换每个值,但每个随机数应该在相同的 ID 上保持相同的数字。
例如,我想像这样屏蔽列中的数据:
id
123
987
987
456
00
456
注意相同的 ID 具有相同的值。我该如何实现这一目标?我有几千个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
我的想法:
从您的列中获取唯一值,
随机排列唯一值,
为每个元素创建一个新值列表(从 0 到唯一值的数量),
创建字典,其中初始值作为字典键,新值作为字典值,
使用创建的字典将值映射到您的列。
从随机导入随机播放
my_col = 'my_col'#您的敏感列名称(int类型)
initial_unique_vals = df[my_col].unique() new_values = 列表(范围(0,len(initial_unique_vals))) 随机播放(initial_unique_vals) dict_init_new_values = dict(zip(initial_unique_vals, new_values)) df[my_col] = df[my_col].map(dict_init_new_values)