2015-07-03 65 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