我想根据DataFrame中的ID列生成1到n之间的随机数。此ID列中的重复值应具有相同的随机数。应该为一个以上的ID分配一个随机数,但是属于每个随机数的ID数应尽可能相等或最大。我还希望通过种子值来复制结果。
一个非常简单的示例,就是说我有一个ID列,其值为A,B,C,D,E。我想分配一个1到2的随机数。因此,在此示例中,将ID A,B,E分配给随机数1,将ID C,D分配给2。
ID Random
A 1
C 2
A 1
B 1
E 1
D 2
此外,我的DataFrame非常大,因此速度非常重要。
更新:我之前尝试的是获取ID的唯一列表,然后为每个ID生成随机数,但是我制作了一个DataFrame并尝试合并两个DataFrame,这太耗时了。
答案 0 :(得分:1)
感谢S3DEV,他建议将字典映射到该列,这要快得多。
ID_list = df['ID'].unique()
random_list = np.random.randint(1, 2, size=len(ID_list))
dic = {ID_list[i]: random_list[i] for i in range(len(ID_list))}
df['Random'] = df['ID'].map(dic)
答案 1 :(得分:0)
要修正您的方法(即创建侧面数据框):
n = 10
ids = df[["ID"]].drop_duplicates()
ids["Random"] = np.random.randint(1, n, len(ids))
ids.set_index("ID", inplace=True)
df.set_index("ID", inplace=True)
df["Random"] = ids["Random"]
df.reset_index(inplace=True)
输出:
ID Random
0 A 6
1 C 7
2 A 6
3 B 4
4 E 1
5 D 6