如何使用Scikit-learn按标准差标准化DataFrame及left-x列?
嘿,这两个问题都是围绕Scikit-learn的StandardScaler实现按标准差的标准化(Z-score标准化),公式是(x - 均值)/标准差,我给你一步步拆解解决方案:
1. 对整个DataFrame进行标准差标准化
首先得导入需要的库,然后按步骤来:
- 初始化
StandardScaler对象,它会帮我们计算每列的均值和标准差,再用这两个值做标准化 - 用
fit_transform处理DataFrame的数值列(如果有非数值列,记得先过滤,不然会报错) - 把处理后的数组转回DataFrame,保留原列名
代码示例:
import pandas as pd from sklearn.preprocessing import StandardScaler # 先搞个示例DataFrame df = pd.DataFrame({ 'A': [1, 2, 3, 4, 5], 'B': [10, 20, 30, 40, 50], 'C': [100, 200, 300, 400, 500] }) # 初始化标准化器 scaler = StandardScaler() # 对所有数值列做标准化(这里示例里全是数值列) scaled_data = scaler.fit_transform(df) # 转回DataFrame,保留原列名 scaled_df = pd.DataFrame(scaled_data, columns=df.columns) print(scaled_df)
小贴士:如果之后要对新数据做同样的标准化,只用调用
scaler.transform(new_data)就行,别再fit了,避免数据泄露哦!
2. 对DataFrame中的特定列(left-x列)进行标准差标准化
这里分两种场景,看你需求选:
方法一:单独处理目标列后替换回原DataFrame
适合只需要标准化left-x列,其他列保持原样的情况:
import pandas as pd from sklearn.preprocessing import StandardScaler # 示例DataFrame df = pd.DataFrame({ 'left-x': [5, 10, 15, 20, 25], 'other_num_col': [1, 2, 3, 4, 5], 'other_cat_col': ['a', 'b', 'c', 'd', 'e'] }) scaler = StandardScaler() # 注意:Scikit-learn的转换器期望输入是二维数组,所以要用df[['left-x']](双括号),不能用df['left-x'] # 如果你想新增一列存标准化后的值: df['left-x_scaled'] = scaler.fit_transform(df[['left-x']]) # 要是想直接替换原列,就写: # df['left-x'] = scaler.fit_transform(df[['left-x']]) print(df)
方法二:用ColumnTransformer批量处理(适合多列场景)
如果你的DataFrame里有多个数值列,只想标准化left-x,其他数值列和非数值列都保留,用ColumnTransformer更高效:
import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.compose import ColumnTransformer # 示例DataFrame df = pd.DataFrame({ 'left-x': [5, 10, 15, 20, 25], 'another_num_col': [100, 200, 300, 400, 500], 'cat_col': ['x', 'y', 'z', 'x', 'y'] }) # 定义转换器:只对"left-x"应用StandardScaler,其他列直接保留 preprocessor = ColumnTransformer( transformers=[ ('scaler', StandardScaler(), ['left-x']) ], remainder='passthrough' # 这句很重要,保留未指定的所有列 ) # 处理数据并转回DataFrame processed_data = preprocessor.fit_transform(df) processed_df = pd.DataFrame(processed_data, columns=preprocessor.get_feature_names_out()) print(processed_df)
内容的提问来源于stack exchange,提问作者JP Ventura
相关产品推荐
相关产品推荐

