如何用sklearn StandardScaler处理pandas DataFrame并保留列名?
问题解决:缩放DataFrame后列名丢失与statsmodels回归报错
问题根源
- 列名丢失:
StandardScaler.fit_transform()返回的是numpy数组,转成DataFrame时未指定列名,导致原列名Inflation、Homes被替换成0、1。 - 回归公式错误:你使用的公式
1 ~ 0不符合OLS回归语法——既没有指定因变量也没有自变量,statsmodels无法生成有效回归矩阵,最终触发维度相关报错。
解决步骤
1. 恢复原始列名
将缩放后的数组转回DataFrame时,显式指定columns参数为原始特征列表,就能保留原来的列名:
# 替换原转DataFrame代码 df_scaled = pd.DataFrame(std_scaler.fit_transform(X), columns=num_features)
2. 修正OLS回归公式
根据分析需求,明确指定因变量和自变量。比如以Homes为因变量、Inflation为自变量:
- 带截距回归:
Homes ~ Inflation - 不带截距回归:
Homes ~ Inflation - 1(或Homes ~ 0 + Inflation)
修正后的完整代码
import pandas as pd from sklearn.preprocessing import StandardScaler import statsmodels.formula.api as smf # 读取数据 df = pd.read_excel("C:/Users/ME/OneDrive/Desktop/simple regress.xlsx") print(df) # 定义特征并缩放 num_features = ['Inflation', 'Homes'] X = df[num_features] std_scaler = StandardScaler() # 转回DataFrame时保留原始列名 df_scaled = pd.DataFrame(std_scaler.fit_transform(X), columns=num_features) # 执行OLS回归(示例:Homes为因变量,Inflation为自变量,带截距) result = smf.ols(formula='Homes ~ Inflation', data=df_scaled).fit() # 查看回归结果 print(result.summary())
内容的提问来源于stack exchange,提问作者Tony Cardinal
相关产品推荐
相关产品推荐

