2015-07-03 25 views
5

पर कुशल गणना मुझे अपना कोड तेज़ी से बनाने की आवश्यकता है। समस्या बहुत सरल है, लेकिन मुझे पूरे डेटाफ्रेम के माध्यम से लूपिंग के बिना गणना करने का एक अच्छा तरीका नहीं मिल रहा है।पांडा डेटाफ्रेम

मैं तीन dataFrames मिल गया है:

एक (10 पंक्तियाँ):

 Canal Gerencia grad 
0 'ABC' 'DEF' 23 
etc... 
ए, बी और सी

ए और बी प्रत्येक 3 कॉलम, और निम्न स्वरूप है

बी (25 पंक्तियाँ):

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

DataFrame सी, दूसरे हाथ पर, 5 स्तंभ हैं:

सी (5000 पंक्तियाँ):

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

मैं DataFrame 'सी' है कि तीन तालिकाओं से 'स्नातक' का मान कहते हैं की एक ही लंबाई के साथ एक वेक्टर की जरूरत है, उदाहरण के लिए:

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 

मैंने सी डेटा फ्रेम के माध्यम से लूपिंग करने की कोशिश की, लेकिन बहुत धीमी है। मैं समझता हूं कि मुझे डेटा फ्रेम के माध्यम से लूप से बचने की कोशिश करनी चाहिए, लेकिन यह नहीं पता कि यह कैसे करें।

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

मैं वास्तव में जल्दी इस दिनचर्या बनाने पर किसी भी मदद की सराहना करेंगे: मेरी वास्तविक कोड निम्नलिखित (काम करता है, लेकिन बहुत धीमी गति से) है। धन्यवाद!

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

(यह यह करने के लिए एक स्तंभ जोड़ना होगा) और फिर B साथ मर्ज करने के परिणाम: (

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

फिर से एक कॉलम शामिल

उत्तर

4

IIUC, आप CA के साथ विलय करने की जरूरत है C)

इस बिंदु पर, कॉलम के नाम के लिए C देखें; कहते हैं कि वे grad_foo, grad_bar, grad_baz हैं। तो बस उन्हें

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

धन्यवाद! यही वही था जो मुझे चाहिए था! – learn2day

संबंधित मुद्दे