我有一个DataFrame,df,在pandas中有系列df.A和df.B,我正在尝试创建第三个系列,df.C依赖于A和B以及之前的结果.那是:
C [0] = A [0]
C [n] = A [n] B [n] * C [n-1]
这样做最有效的方法是什么?理想情况下,我不必回到for循环.
编辑
这是给定A和B的C的期望输出.现在只需要弄清楚如何…
import pandas as pd
a = [ 2,3,-8,-2,1]
b = [ 1,1,4,2,1]
c = [ 2,5,12,22,23]
df = pd.DataFrame({'A': a,'B': b,'C': c})
df
最佳答案
您可以使用令人讨厌的累积产品和其他向量的拉链来对此进行矢量化.但它不会最终节省你的时间.事实上,它可能在数值上不稳定.
相反,你可以使用numba加速你的循环.
from numba import njit
import numpy as np
import pandas as pd
@njit
def dynamic_alpha(a,b):
c = a.copy()
for i in range(1,len(a)):
c[i] = a[i] + b[i] * c[i - 1]
return c
df.assign(C=dynamic_alpha(df.A.values,df.B.values))
A B C
0 2 1 2
1 3 1 5
2 -8 4 12
3 -2 2 22
4 1 1 23
对于这个简单的计算,这将与简单计算一样快
df.assign(C=np.arange(len(df)) ** 2 + 2)
df = pd.concat([df] * 10000)
%timeit df.assign(C=dynamic_alpha(df.A.values,df.B.values))
%timeit df.assign(C=np.arange(len(df)) ** 2 + 2)
06003