2015-07-03 14 views
5

Ich muss meinen Code schneller machen. Das Problem ist sehr einfach, aber ich finde keine gute Möglichkeit, die Berechnung durchzuführen, ohne den gesamten DataFrame durchlaufen zu müssen.Effiziente Berechnung auf einem Pandas Datenrahmen

Ich habe drei Datenrahmen bekommt: A, B und C.

A und B 3 Spalten je, und das folgende Format:

A (10 Zeilen):

 Canal Gerencia grad 
0 'ABC' 'DEF' 23 
etc... 

B (25 Zeilen):

 Marca Formato grad 
0 'GHI' 'JKL' 43 
etc... 

Datenrahmen C, auf der anderen Seite, hat 5 Spalten:

C (5000 Zeilen):

 Marca Formato Canal Gerencia grad 
0 'GHI' 'JKL' 'ABC' 'DEF' -102 
etc... 

Ich brauche einen Vektor mit der gleichen Länge von Datenrahmen ‚C‘, die die Werte von ‚grad‘ aus den drei Tabellen, beispielsweise aufsummiert:

m = 'GHI' 
f = 'JKL' 
c = 'ABC' 
g = 'DEF' 
res = C['grad'][C['Marca']==m][C['Formato']==f][C['Canal']==c][C['Gerencia']==g] + A['grad'][A['Canal']==c][A['Gerencia']==g] + B['grad'][B['Formato']==f][B['Marca']==m] 
>>-36 

Ich habe versucht, den C-Datenrahmen zu durchlaufen, aber ist zu langsam. Ich verstehe, dass ich versuchen sollte, die Schleife durch den Datenrahmen zu vermeiden, aber nicht weiß, wie man das macht. Mein eigentlicher Code ist folgende (Arbeiten, aber sehr langsam):

res=[] 
for row_index, row in C.iterrows(): 
    vec1 = A['Gerencia']==row['Gerencia'] 
    vec2 = A['Canal']==row['Canal'] 
    vec3 = B['Marca']==row['Marca'] 
    vec4 = B['Formato']==row['Formato'] 
    grad = row['grad'] 
    res.append(grad + sum(A['grad'][vec1][vec2])+ sum(B['grad'][vec3][vec4])) 

ich wirklich jede Hilfe schneller zu machen diese Routine schätzen würde. Vielen Dank!

Antwort

4

IIUC, müssen Sie C fusionieren mit A:

C = pd.merge(C, A, on=['Canal', 'Gerencia']) 

(dies wird eine Spalte, um es hinzuzufügen) und dann das Ergebnis verschmelzen mit B:

C = pd.merge(C, B, on=['Marca', 'Formato']) 

(wieder eine Spalte hinzufügen zu C)

An diesem Punkt überprüfen Sie C für die Namen der Spalten; sagen sie sind grad_foo, grad_bar, grad_baz. Also fügen Sie sie einfach

C.grad_foo + C.grad_bar + C.grad_baz 
+0

Vielen Dank! Das war genau das, was ich brauchte! – learn2day

Verwandte Themen