我的数据帧约为20万行
我有一个名为A
的列,它给了我一个id(总共有~10K ID)。
此id的值定义随机分布的参数。
现在我想生成一个列B
,它是从A
列
最快的方法是什么?使用iterrows
或apply
执行操作非常慢。另一种可能性是按A
进行分组,并为A的每个值生成所有数据(因此我只从一个分布中绘制)。但是,我不是最终得到一个数据帧,而是一个" groupBy"对象,我不知道如何回到初始数据框,再加上我的新专栏。
答案 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])