用前一行值乘以另一列填充 nan 的熊猫

sus*_*nde 4 python pandas

我有数据框,我想用 pct_change 列乘以前几行的值填充 nan

    col_to_fill       pct_change
0       1                NaN
1       2                1.0
2       10               0.5
3       nan              0.5
4       nan              1.3
5       nan              2
6       5                3
Run Code Online (Sandbox Code Playgroud)

因此,3rd row 10*0.5 = 5如果为 nan,则使用该填充值填充下一行。

    col_to_fill        pct_change
0       1                NaN
1       2                1.0
2       10               0.5
3       5                0.5
4       6.5              1.3
5       13               2
6       5                3
Run Code Online (Sandbox Code Playgroud)

我用过这个

while df['col_to_fill'].isna().sum() > 0:
    df.loc[df['col_to_fill'].isna(), 'col_to_fill'] = df['col_to_fill'].shift(1) * df['pct_change']
Run Code Online (Sandbox Code Playgroud)

但它花费了太多时间,因为它只在一个循环中填充前一行是 nonnan 的那些行。

WeN*_*Ben 7

尝试cumprodffill

s = df.col_to_fill.ffill()*df.loc[df.col_to_fill.isna(),'pct_change'].cumprod()
df.col_to_fill.fillna(s, inplace=True)
df
Out[90]: 
   col_to_fill  pct_change
0          1.0         NaN
1          2.0         1.0
2         10.0         0.5
3          5.0         0.5
4          6.5         1.3
5         13.0         2.0
6          5.0         3.0
Run Code Online (Sandbox Code Playgroud)