我有一个带有非唯一数字列的 Pandas DataFrame。我想为每个非唯一值返回一个不同的随机数,但在非唯一值出现的每一行返回相同的随机数,即随机数的输出数据帧的形状与未分组数据帧的形状匹配.
我可以这样做: df.groupby('NonUnique').transform(lambda x: np.random.rand())
这会根据需要为 df 中的每一列返回一个不同的随机数。
然而,这对于大型数据帧来说很慢,但是 np.random.rand(df.size) 非常快。有没有办法以更有效的方式实现我想要的?我似乎找不到一种方法来向量化每组的分配...
请您参考如下方法:
按唯一值的长度创建数组,然后使用 factorize使用 numpy 索引 进行重复:
np.random.seed(123)
df = pd.DataFrame({'A':list('aaabbb')})
a = np.random.rand(len(df['A'].unique()))
df['B'] = a[pd.factorize(df.A)[0]]
print (df)
A B
0 a 0.696469
1 a 0.696469
2 a 0.696469
3 b 0.286139
4 b 0.286139
5 b 0.286139
详细信息:
print (pd.factorize(df.A)[0])
[0 0 0 1 1 1]
