首页 > 解决方案 > 基于 Python 中前一行的值填充列的行的矢量化解决方案

问题描述

数据框:

df = pd.DataFrame({"X":[1,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan]})

print(df)
     X
0  1.0
1  NaN
2  NaN
3  NaN
4  NaN
5  NaN

我想通过从前一行获取平方值并添加一个来填充 np.nan。

期望的输出:

         X
0       1.0
1       2.0
2       5.0
3      26.0
4     677.0
5  458330.0

这可以通过一个 for 循环来完成:

for i in range(1,len(df)):
    df["X"].iloc[i] = ((df["X"].iloc[i-1]) ** 2) + 1

但是寻找相同问题的矢量化解决方案

标签: pythonpandasnumpyvectorization

解决方案


不幸的是,向量化解决方案是有问题的,因为使用了先前的输出值。为了提高性能,使用numba

@jit(nopython=True)
def f(a):
    for i in range(1, a.shape[0]):
        a[i] = a[i-1] ** 2 + 1
    return a

df['X'] = f(df['X'].to_numpy())
print (df)
                X
0    1.000000e+00
1    2.000000e+00
2    5.000000e+00
3    2.600000e+01
4    6.770000e+02
5    4.583300e+05
6    2.100664e+11
7    4.412789e+22
8    1.947270e+45
9    3.791862e+90
10  1.437822e+181

推荐阅读