如何使用numpy.where()或fillna()逐行结合增长率填充pandas NaN值
你之前使用的np.where和fillna都是基于填充前的原始DataFrame数据做向量化计算,计算第6行的填充值时,取到的shift(1)还是第5行未填充的NaN,因此只能填充首个缺失行,无法复用刚计算出的新值。
可以通过增长率累积乘积的方法一步完成填充,不需要重复运行代码:
import pandas as pd import numpy as np data = {'value':[55,58,60,62,64,np.nan,np.nan], 'growth_rate': [np.nan,1.0545,1.034483,1.033333,1.032258,1.02,1.03]} df = pd.DataFrame(data) # 定位value列最后一个非缺失值的索引和对应基准值 last_valid_idx = df['value'].last_valid_index() base_val = df.loc[last_valid_idx, 'value'] # 用基准值乘后续增长率的累积乘积,直接填充所有缺失值 df.loc[last_valid_idx+1:, 'value'] = base_val * df.loc[last_valid_idx+1:, 'growth_rate'].cumprod() print(df)
运行后输出结果符合预期:
value growth_rate 0 55.0000 NaN 1 58.0000 1.054500 2 60.0000 1.034483 3 62.0000 1.033333 4 64.0000 1.032258 5 65.2800 1.020000 6 67.2384 1.030000
该方法为pandas原生向量化运算,不需要逐行循环,执行效率高,且支持任意长度的后续连续缺失值填充。
内容的提问来源于stack exchange,提问作者Juan Pablo Romero
相关产品推荐
相关产品推荐

