2015-07-03 61 views
5

我需要更快地完成我的代碼。問題很簡單,但我沒有找到一個好的方法來進行計算,而無需循環整個DataFrame。對熊貓數據幀的高效計算

我有三個dataFrames:A,B和C.

A和B具有每個3列和格式如下:

A(10行):

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

B(25行):

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

數據幀C,在另一方面,有5列:

C(5000行):

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

我需要與數據幀「C」,從三個表加起來「畢業生」的值的相同長度的矢量,例如:

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 

我試着循環播放C數據幀,但速度太慢。我知道我應該儘量避免通過dataFrame的循環,但不知道如何做到這一點。我的實際代碼是以下(作品,但非常慢):

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

我真的很感激任何幫助,使這個例程更快。謝謝!

回答

4

IIUC,你需要合併CA

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

(這將一列添加到它),然後合併與B結果:

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

(再添加一列到C

在這一點上,檢查C列的名稱;說他們是grad_foo,grad_bar,grad_baz。所以只需添加它們

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

謝謝!那正是我需要的! – learn2day