2017-07-11 89 views
1

我需要做下面的计算:如何有效地计算大熊猫的列的线性组合?

priors['user_product'] = priors.eval('product_id + user_id*100000') 

其中user_product是一个新的列,我想产生。 但是计算需要花费大量的时间,因为先验数据框是巨大的(有300万行,要准确)

+1

'先验[ 'user_product'] =先验[ 'PRODUCT_ID'] +先验[ 'USER_ID'] * 100000'是slowier? – jezrael

+0

由于某种原因,通过您提及的方法,通过熊猫计算花费了大量时间。 Eval也导致了问题。查看熊猫文档,如果安装了库,我实现了使用numexpr作为后端的评估。所以立即安装numexpr会导致更快的计算。 – siebenheaven

回答

3

如果你想快,你可以使用numpynumexpr或正常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