使用基于另一列的随机元素生成列的最快方法

时间:2017-09-27 00:41:32

标签: python pandas

我的数据帧约为20万行

我有一个名为A的列,它给了我一个id(总共有~10K ID)。 此id的值定义随机分布的参数。 现在我想生成一个列B,它是从A

列中的值定义的分布中随机抽取的

最快的方法是什么?使用iterrowsapply执行操作非常慢。另一种可能性是按A进行分组,并为A的每个值生成所有数据(因此我只从一个分布中绘制)。但是,我不是最终得到一个数据帧,而是一个" groupBy"对象,我不知道如何回到初始数据框,再加上我的新专栏。

2 个答案:

答案 0 :(得分:2)

这个问题很模糊,但这对你有用吗?

df['B'] = df.apply(lambda row: distribution(row.A), axis=1)

从问题编辑进行编辑(应用太慢)

您可以为10k ID创建一个映射字典到它们生成的值,然后执行类似

的操作
df['B'] = df['A'].map(dictionary)

我不确定这是否比应用更快,但是对随机分发生成器的调用需要更少

答案 1 :(得分:2)

我认为这种方法类似于您所描述的方法,您可以为每个ID生成样本。在我的机器上,似乎需要大约5分钟才能运行。我假设你可以轻而易举地获得ID。

import numpy as np

num_ids = 10000
num_rows = 20000000
ids = np.arange(num_ids)
loc_params = np.random.random(num_ids)
A = np.random.randint(0, num_ids, num_rows)
B = np.zeros(A.shape)

for idx in ids:
    A_idxs = A == idx
    B[A_idxs] = np.random.normal(np.sum(A_idxs), loc_params[idx])