2017-07-11 3 views
1

Ich brauche die folgende Berechnung zu tun:Wie berechnet man eine lineare Kombination von Säulen in Pandas effizient?

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

wo user_product eine neue Spalte ist, die ich erzeugen will. jedoch die Berechnung viel Zeit in Anspruch nimmt, da die priors Datenrahmen riesig ist (hat 3.000.000 Zeilen, um genau zu sein)

+1

'priors [ 'user_product'] = priors [ 'product_id'] + priors [ 'user_id'] * 100000' ist slowier? – jezrael

+0

Es hat ewig gedauert, aus irgendwelchen Gründen über Pandas mit der von Ihnen erwähnten Methode zu rechnen. Eval führte auch zu Problemen. Wenn ich mir die pandas-Dokumentation ansehe, habe ich eval mit numexpr als Backend realisiert, wenn die Bibliothek installiert ist. Die Installation von numexpr führte sofort zu einer viel schnelleren Berechnung. – siebenheaven

Antwort

3

Wenn Sie schnell wünschen, Sie numpy oder numexpr oder normalen pandas

pandas

verwenden können
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') 

Zeit

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 
Verwandte Themen