2015-07-03 30 views
5

Devo rendere il mio codice più veloce. Il problema è molto semplice, ma non sto trovando un buon modo per effettuare il calcolo senza eseguire il loop dell'intero DataFrame.Calcolo efficiente su un dataframe panda

Ho tre dataFrames: A, B e C.

A e B hanno 3 colonne ciascuno, e il seguente formato:

A (10 righe):

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

B (25 righe):

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

dataframe C, d'altra parte, ha 5 colonne:

C (5000 righe):

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

ho bisogno di un vettore con la stessa lunghezza di dataframe 'C' che somma i valori di 'grad' dalle tre tabelle, ad esempio:

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 

Ho tentato di eseguire il looping del C dataFrame, ma è troppo lento. Capisco che dovrei cercare di evitare il ciclo attraverso il dataFrame, ma non so come farlo. Il mio codice attuale è la seguente (opere, ma molto lento):

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])) 

Vorrei davvero apprezzare alcun aiuto a fare questa routine più veloce. Grazie!

risposta

4

IIUC, è necessario unire C con A:

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

(questo aggiungerà una colonna ad esso) e quindi unire il risultato con B:

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

(di nuovo l'aggiunta di una colonna a C)

A questo punto, controllare C per i nomi delle colonne; dicono che sono grad_foo, grad_bar, grad_baz. Quindi aggiungili semplicemente

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

Grazie! Era esattamente ciò di cui avevo bisogno! – learn2day