如何用每个唯一值的随机数(随机分类)替换 Pandas 列中的值?

问题描述 投票:0回答:3

我有一个 df,其列如下所示:

id   
11    
22
22
333
33
333

此列是敏感数据。我想用任何随机数替换每个值,但每个随机数应该在相同的 ID 上保持相同的数字。

例如,我想像这样屏蔽列中的数据:

id   
123   
987
987
456
00
456

注意相同的 ID 具有相同的值。我该如何实现这一目标?我有几千个ID。

python python-3.x pandas anonymity categorical
3个回答
1
投票

我会建议这样的事情:

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

1
投票

这里有两个选项,可以生成分类(非随机,

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
投票

我的想法:

  1. 从您的列中获取唯一值,

  2. 随机排列唯一值,

  3. 为每个元素创建一个新值列表(从 0 到唯一值的数量),

  4. 创建字典,其中初始值作为字典键,新值作为字典值,

  5. 使用创建的字典将值映射到您的列。

    从随机导入随机播放

    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)

© www.soinside.com 2019 - 2024. All rights reserved.