熊猫的递归关系

时间:2018-03-18 09:59:48

标签: python pandas numpy

我在系列Pixels[][]df的pandas中有一个DataFrame df.A,我正在尝试创建一个依赖于A和B的第三个系列df.B以及之前的结果。那就是:

df.C

C[0]=A[0]

这样做最有效的方法是什么?理想情况下,我不必回到C[n]=A[n] + B[n]*C[n-1]循环。

修改

这是给定A和B的C的期望输出。现在只需要弄清楚如何...

for

2 个答案:

答案 0 :(得分:4)

您可以使用令人讨厌的累积产品和其他载体的拉链来对此进行矢量化。但它不会最终节省你的时间。事实上,它可能在数值上不稳定。

相反,您可以使用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)
337 µs ± 5.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
333 µs ± 20.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

答案 1 :(得分:-1)

试试这个:

C[0]=A[0] C=[A[i]+B[i]*C[i-1] for i in range(1,len(A))]

比循环快得多。