Python中多项式回归预测值存入DataFrame的空值问题求解
核心原因
PolynomialFeatures输出的numpy数组本身不携带pandas索引,直接把数组赋值给Test列时,没有和分组内的原始行索引对齐,就会出现空值。
解决方法
核心原则是分组拟合时,始终保留当前分组的原始索引,将预测值转换为带索引的Series再赋值,不要直接用无索引的numpy数组赋值。
示例代码实现
1. 依赖导入
import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures
2. 循环分组拟合方案
# 初始化模型 poly_trans = PolynomialFeatures(degree=2) linear_reg = LinearRegression() poly_reg = LinearRegression() # 按Value字段分组迭代 for group_val, group_df in df.groupby('Value'): # 提取特征、标签,保留当前分组在全局DataFrame中的索引 X = group_df[['特征列名']] y = group_df['目标列名'] current_idx = group_df.index # 线性回归预测(原有逻辑保留即可) linear_reg.fit(X, y) Test.loc[current_idx, 'linear_pred'] = linear_reg.predict(X) # 多项式回归预测:显式绑定索引后赋值 X_poly = poly_trans.fit_transform(X) poly_reg.fit(X_poly, y) # 将numpy格式的预测结果转为带当前分组索引的Series poly_pred_series = pd.Series(poly_reg.predict(X_poly), index=current_idx) Test.loc[current_idx, 'poly2_pred'] = poly_pred_series
3. groupby.apply更简洁方案
如果不想写循环,用apply返回带索引的结果可以自动对齐:
def group_fit_func(group_df): X = group_df[['特征列名']] y = group_df['目标列名'] # 线性回归预测 linear_pred = LinearRegression().fit(X, y).predict(X) # 二阶多项式回归预测 X_poly = PolynomialFeatures(2).fit_transform(X) poly2_pred = LinearRegression().fit(X_poly, y).predict(X_poly) # 返回带当前分组索引的结果表 return pd.DataFrame({'linear_pred': linear_pred, 'poly2_pred': poly2_pred}, index=group_df.index) # 直接合并预测结果到Test Test = pd.concat([Test, df.groupby('Value').apply(group_fit_func)], axis=1)
注意事项
不要把多个分组的多项式预测结果拼接成无索引的长数组后直接赋值给Test整列,跨分组的数组没有全局索引对应关系,必然会出现错位空值。
内容的提问来源于stack exchange,提问作者g123456k
相关产品推荐
相关产品推荐

