如何在pandas多项式拟合时排除log_norm列指定行的数值
问题解答
完全可以在拟合阶段排除指定行,只需要在传入np.polyfit时过滤掉对应行的数据即可,以下是两种常用实现方案:
方法1:基于索引删除指定行(适配默认整数索引场景)
如果你的数据框是默认从0开始的连续整数索引,直接删除对应索引行后拟合即可:
# 拟合阶段仅使用排除0、1、6索引后的数据 fit_data = df1.drop(index=[0, 1, 6]) d = np.polyfit(fit_data['S_B'], fit_data['log_norm'], 1) f = np.poly1d(d) # 预测阶段仍使用全量数据,和原有逻辑保持一致 df1['predicted'] = getExp(f(df1['S_B'])) * df1['Cl']
方法2:基于行位置过滤(适配自定义索引场景)
如果你的数据框使用自定义索引,要按物理行位置排除第0、1、6行,可以用位置索引生成过滤掩码:
# 生成过滤掩码,排除物理位置为0、1、6的行 exclude_pos = [0, 1, 6] mask = ~df1.index.isin(df1.iloc[exclude_pos].index) fit_x = df1.loc[mask, 'S_B'] fit_y = df1.loc[mask, 'log_norm'] d = np.polyfit(fit_x, fit_y, 1) f = np.poly1d(d) df1['predicted'] = getExp(f(df1['S_B'])) * df1['Cl']
可选优化
你自定义的getExp函数仅支持单个数值计算,传入numpy数组时会报错,可直接使用numpy内置的向量化指数函数替换,性能更高且适配数组输入:
# 替换原有getExp调用 df1['predicted'] = np.exp(f(df1['S_B'])) * df1['Cl']
内容的提问来源于stack exchange,提问作者Anme
相关产品推荐
相关产品推荐

