2015-07-03 3 views
5

Мне нужно сделать мой код быстрее. Проблема очень проста, но я не нахожу хороший способ сделать вычисление без цикла через весь DataFrame.Эффективный расчет на базе данных pandas

У меня три dataFrames: A, B и C.

А и В имеют 3 колонки каждый, и следующий формат:

A (10 строк):

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

в (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 «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, вам необходимо объединить C с A:

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

Смежные вопросы