1
我需要做下面的计算:如何有效地计算大熊猫的列的线性组合?
priors['user_product'] = priors.eval('product_id + user_id*100000')
其中user_product
是一个新的列,我想产生。 但是计算需要花费大量的时间,因为先验数据框是巨大的(有300万行,要准确)
我需要做下面的计算:如何有效地计算大熊猫的列的线性组合?
priors['user_product'] = priors.eval('product_id + user_id*100000')
其中user_product
是一个新的列,我想产生。 但是计算需要花费大量的时间,因为先验数据框是巨大的(有300万行,要准确)
如果你想快,你可以使用numpy
或numexpr
或正常pandas
pandas
priors['user_product'] = priors.product_id + 100000 * priors.user_id
numpy
priors['user_product'] = priors.product_id.values + 100000 * priors.user_id.values
numexpr
pid = priors.product_id.values
uid = priors.user_id.values
priors['user_product'] = numexpr.evaluate('pid + 100000 * uid')
时序
n = 3000000
priors = pd.DataFrame(dict(product_id=np.random.rand(n), user_id=np.random.rand(n)))
%timeit priors['user_product'] = priors.eval('product_id + 100000 * user_id')
%timeit priors['user_product'] = priors.product_id.values + 100000 * priors.user_id.values
%timeit priors['user_product'] = priors.product_id + 100000 * priors.user_id
10 loops, best of 3: 31.6 ms per loop
100 loops, best of 3: 17.6 ms per loop
100 loops, best of 3: 18.5 ms per loop
%%timeit
pid = priors.product_id.values
uid = priors.user_id.values
priors['user_product'] = numexpr.evaluate('pid + 100000 * uid')
100 loops, best of 3: 13.6 ms per loop
'先验[ 'user_product'] =先验[ 'PRODUCT_ID'] +先验[ 'USER_ID'] * 100000'是slowier? – jezrael
由于某种原因,通过您提及的方法,通过熊猫计算花费了大量时间。 Eval也导致了问题。查看熊猫文档,如果安装了库,我实现了使用numexpr作为后端的评估。所以立即安装numexpr会导致更快的计算。 – siebenheaven