如何在Python中标准化与归一化数据?代码报错求解决
问题分析与修正方案
原代码的核心错误是对sklearn预处理工具的调用方式完全错误,同时未考虑数据中的非数值列和缺失值问题,以下是修正后的完整代码及说明:
主要错误点
StandardScaler是sklearn.preprocessing中的类,不能直接通过DataFrame对象调用,必须先实例化类,再用fit_transform方法处理数据normalize是sklearn.preprocessing中的函数,不是DataFrame的方法,需直接调用并传入数值型数据- 未处理数据中的非数值列和缺失值,这会导致预处理函数报错
- 计算标准差时,pandas的方法是
std()而非stdev()
修正后的代码
import pandas as pd from sklearn import preprocessing # 读取数据 hmeq = pd.read_csv('hmeq_small.csv') # 1. 预处理:筛选数值型列并填充缺失值(避免StandardScaler报错) numeric_cols = hmeq.select_dtypes(include=['int64', 'float64']).columns hmeq_numeric = hmeq[numeric_cols].fillna(hmeq[numeric_cols].mean()) # 2. 标准化处理 scaler = preprocessing.StandardScaler() # fit_transform返回数组,转为DataFrame并保留原列名 hmeqStand = pd.DataFrame(scaler.fit_transform(hmeq_numeric), columns=numeric_cols) # 3. 归一化处理(默认L2归一化,按行处理) normalized_data = preprocessing.normalize(hmeq_numeric) hmeqNorm = pd.DataFrame(normalized_data, columns=numeric_cols) # 4. 输出统计信息 print("标准化数据的均值:\n", hmeqStand.mean()) print("\n标准化数据的标准差:\n", hmeqStand.std()) print("\n归一化数据的均值:\n", hmeqNorm.mean()) print("\n归一化数据的标准差:\n", hmeqNorm.std())
关键说明
- 先筛选数值型列:标准化/归一化只适用于数值数据,需排除字符串等非数值列
- 填充缺失值:
StandardScaler和normalize都无法处理NaN值,这里用列均值填充,你也可以根据需求用中位数、0或其他方式填充 - 标准化流程:实例化
StandardScaler→ 用fit_transform拟合并转换数据 → 转为DataFrame保留列名 - 归一化流程:直接调用
preprocessing.normalize传入数值数据 → 转为DataFrame
内容的提问来源于stack exchange,提问作者Code2345
相关产品推荐
相关产品推荐

