我需要让代码更快.问题很简单,但我没有找到一个好的方法来进行计算而不循环遍历整个DataFrame.
我有三个dataFrames:A,B和C.
A和B各有3列,格式如下:
A(10行):
Canal Gerencia grad
0 'ABC' 'DEF' 23
etc...
Run Code Online (Sandbox Code Playgroud)
B(25行):
Marca Formato grad
0 'GHI' 'JKL' 43
etc...
Run Code Online (Sandbox Code Playgroud)
另一方面,DataFrame C有5列:
C(5000行):
Marca Formato Canal Gerencia grad
0 'GHI' 'JKL' 'ABC' 'DEF' -102
etc...
Run Code Online (Sandbox Code Playgroud)
我需要一个具有相同长度的DataFrame'C'的向量,它将三个表中的'grad'值相加,例如:
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
Run Code Online (Sandbox Code Playgroud)
我尝试循环遍历C dataFrame,但速度太慢.我理解我应该尽量避免循环通过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]))
Run Code Online (Sandbox Code Playgroud)
我真的很感激任何帮助,使这个例程更快.谢谢!
IIUC,您需要C合并A:
C = pd.merge(C, A, on=['Canal', 'Gerencia'])
Run Code Online (Sandbox Code Playgroud)
(这将向其中添加一列)然后将结果与B:
C = pd.merge(C, B, on=['Marca', 'Formato'])
Run Code Online (Sandbox Code Playgroud)
(再次添加一列C)
此时,检查C列的名称;说他们是grad_foo,,grad_bar。grad_baz所以只需添加它们
C.grad_foo + C.grad_bar + C.grad_baz
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
124 次 |
| 最近记录: |