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

5
我有一个Pandas DataFrame,其中包含一列非唯一数字。我希望为每个非唯一值返回不同的随机数,但在出现相同值的每一行中返回相同的随机数,即输出的随机数数据框的形状与未分组的数据框相匹配。
我可以这样做: df.groupby('NonUnique').transform(lambda x: np.random.rand()) 这将返回所需的每个 df 列中的不同随机数。
然而,对于大型数据框来说速度很慢,但是 np.random.rand(df.size) 很快。是否有更有效的方法实现我想要的结果?我似乎找不到一种向量化分组分配的方法...
2个回答

3

通过计算唯一值的长度创建数组,然后使用 factorizenumpy 索引 来进行重复:

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]

你能详细说明一下,为什么你不直接使用factorize函数吗?例如s = pd.Series(np.random.randint(1,100,40)) pd.factorize(s)[0] - Fourier
2
@Fourier - 因为 OP 需要随机值,所以 factorize 对于唯一的组始终返回相同的值 0,1,2... - jezrael

3
如果您已经在进行分组操作,可以直接使用ngroup()
df.groupby('column').ngroup()

或者

df.groupby('column').transform('ngroup')

1
请查看@jezrael答案下的我的评论。这将不是随机的,而是自然排序的数字。 - Fourier
自然数排序有什么问题吗? - rafaelc
取决于操作者的任务。按排序出现进行映射将是直截了当的。 - Fourier
2
说实话,我不明白 OP 想要什么。没有示例,没有数据等等。我只是回答了这个问题:“如何在 Pandas 中高效地为每个 groupby 组分配单个值”哈哈。 - rafaelc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接