如何在 Pandas 中有效地为每个组分配单个值

Siy*_*iyh 5 python pandas

我有一个带有一列非唯一数字的 Pandas DataFrame。我想为每个非唯一值返回不同的随机数,但在非唯一值出现的每一行返回相同的随机数,即随机数的输出数据帧的形状与未分组数据帧的形状相匹配。

我可以这样做: df.groupby('NonUnique').transform(lambda x: np.random.rand())

df这将根据需要为 中的每一列返回不同的随机数。

然而,对于大型数据帧来说,这很慢,但np.random.rand(df.size)速度非常快。有什么方法可以更有效地实现我想要的目标吗?我似乎找不到一种方法来矢量化每组的作业......

jez*_*ael 3

按唯一值的长度创建数组,然后使用factorizewithnumpy indexing进行重复:

np.random.seed(123)

df = pd.DataFrame({'A':list('aaabbb')})

a = np.random.rand(df['A'].nunique())

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
Run Code Online (Sandbox Code Playgroud)

细节

print (pd.factorize(df.A)[0])
[0 0 0 1 1 1]
Run Code Online (Sandbox Code Playgroud)

  • @Fourier - 因为 OP 需要随机值,所以“factorize”总是为唯一组返回相同的值“0,1,2...” (2认同)