如何将第 v 列中的值相加,方法是将前一个单元格乘以固定因子,然后添加另一列的当前单元格

问题描述 投票:0回答:1

从“pd.DataFrame”df 开始:~

         n    v
    0    1  0.0
    1    2  0.0
    2    3  0.0
    3    4  0.0
    4    5  0.0
    5    6  0.0

我想将“v”列中的值相加,其中“v”列中的单元格是通过将“v”的前一个单元格乘以固定因子来生成的,然后添加“n”列的当前单元格值。 (参见下面的示例计算表)

    ## sample calculation table :~
    n   v[i]      n  + v[i-1] * fixed factor 
    1   1.0     = 1  + 0.0    * 0.5
    2   2.5     = 2  + 1.0    * 0.5   
    3   4.25    = 3  + 2.5    * 0.5
    4   6.125   = 4  + 4.25   * 0.5
    5   8.0625  = 5  + 6.125  * 0.5
    6  10.03125 = 6  + 8.063  * 0.5

设法通过逐行迭代来做到这一点(参见下面的 for 循环)。

但是我认为矢量化方法(如 cumsum 和 shift)可能更有效,但不知道如何实现;因为 cumsum 因乘法而变得复杂,从空列 v 开始,并且需要引用列的前一个单元格。

想知道如何使用矢量化方法来做到这一点?

重现我的代码:~

    df = pd.DataFrame({'n':[1,2,3,4,5,6]})
    df['v'] = 0.0

    def fnv(nu, vu):
        return nu + vu * 0.5

    for i in range(0, df.shape[0]):
        df.v.at[i] = fnv(df.n.at[i], df.v.at[i-1] if i>0 else 0.0)
    df (RESULTS) :~
         n      v
    0    1   1.00
    1    2   2.50
    2    3   4.25
    3    4   6.12
    4    5   8.06
    5    6  10.03
python pandas numpy
1个回答
0
投票

使用numba:

from numba import jit

@jit(nopython=True)
def f(a, N):
    d = np.empty(a.shape, dtype=np.float64)
    d[0] = 0
    for i in range(0, a.shape[0]):
        d[i] = a[i] + d[i-1] * N 
    return d

df['v'] = f(df['n'].to_numpy(), 0.5)
print (df)
   n          v
0  1   1.000000
1  2   2.500000
2  3   4.250000
3  4   6.125000
4  5   8.062500
5  6  10.031250
6  7  12.015625
© www.soinside.com 2019 - 2024. All rights reserved.