Pandas基于avg列有效值区间线性公式新增fit列的代码问题求解
问题解决:pandas按区间线性填充fit列
原代码核心问题
- NaN值判断逻辑错误:
np.NaN == np.NaN永远返回False,必须使用pd.isna()或np.isnan()判断空值 - 索引逻辑混淆:原代码混淆了自定义
index列和DataFrame默认行索引,你预期的差值是当前行序号(0开始)和基准行序号的差,不是自定义index列的差值 - 循环逻辑冗余:while循环完全没有必要,且容易触发死循环
正确可运行代码
import pandas as pd import numpy as np # 你的原始数据集 df = pd.DataFrame ({'index': [10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26], 'avg': [130, np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN, 135, np.NaN, np.NaN,np.NaN,np.NaN,np.NaN, 136, np.NaN,np.NaN], 'slope':[.02,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN, .08,np.NaN, np.NaN,np.NaN,np.NaN,np.NaN, .03, np.NaN,np.NaN] }) def calc_fit(df): base_row = None base_avg = None base_slope = None fit_res = [] for row_idx in range(len(df)): current_avg = df.loc[row_idx, 'avg'] # 遇到非空avg值更新基准参数 if not pd.isna(current_avg): base_row = row_idx base_avg = current_avg base_slope = df.loc[row_idx, 'slope'] fit_res.append(base_avg) # 空值用最近一次的基准参数线性计算 else: fit_val = base_avg + base_slope * (row_idx - base_row) fit_res.append(fit_val) df['fit'] = fit_res return df # 调用函数得到结果 df = calc_fit(df)
结果验证
运行后输出的df['fit']和你给出的预期完全一致:[130.0, 130.02, 130.04, 130.06, 130.08, 130.1, 130.12, 130.14, 135.0, 135.08, 135.16, 135.24, 135.32, 135.4, 136.0, 136.03, 136.06]
内容的提问来源于stack exchange,提问作者Aimas
相关产品推荐
相关产品推荐

