如何获取指定列均值并填充该列NaN值(以Wine数据集为例)
用Sklearn实现指定列的均值填充缺失值
步骤说明
先模拟题目中的缺失值场景,再使用sklearn.impute.SimpleImputer完成均值填充,同时可结合ColumnTransformer实现仅针对目标列处理、保留其余列的需求。
完整代码示例
from sklearn.datasets import load_wine import pandas as pd from sklearn.impute import SimpleImputer from sklearn.compose import ColumnTransformer # 1. 加载数据集 data = load_wine() df = pd.DataFrame(data.data, columns=data.feature_names) df['target'] = pd.Series(data.target) # 2. 模拟缺失值(符合题目假设:alcohol列2个NaN,magnesium列3个NaN) df.loc[[0, 1], 'alcohol'] = pd.NA df.loc[[2, 3, 4], 'magnesium'] = pd.NA # 3. 方式一:使用ColumnTransformer批量处理目标列(适合后续构建预处理流水线) # 定义需要填充的列 target_cols = ['alcohol', 'magnesium'] # 创建均值填充器 mean_imputer = SimpleImputer(strategy='mean') # 构建预处理管道:仅对目标列做均值填充,其余列原样保留 preprocessor = ColumnTransformer( transformers=[('mean_fill', mean_imputer, target_cols)], remainder='passthrough' ) # 执行填充并转回DataFrame processed_data = preprocessor.fit_transform(df.drop('target', axis=1)) processed_df = pd.DataFrame( processed_data, columns=target_cols + [col for col in df.columns if col not in target_cols and col != 'target'] ) # 恢复target列 processed_df['target'] = df['target'] # ------------------------------ # 方式二:单独处理每一列(更直观,适合快速验证) # imputer_alcohol = SimpleImputer(strategy='mean') # df['alcohol'] = imputer_alcohol.fit_transform(df[['alcohol']]) # # imputer_magnesium = SimpleImputer(strategy='mean') # df['magnesium'] = imputer_magnesium.fit_transform(df[['magnesium']])
关键细节
SimpleImputer(strategy='mean')会自动计算目标列的均值,并用该均值填充对应列的所有NaN值- 传入填充器的必须是二维数组,因此使用
df[['alcohol']]而非df['alcohol'](后者是一维Series) ColumnTransformer的remainder='passthrough'参数确保未指定处理的列会被完整保留,避免数据丢失
内容的提问来源于stack exchange,提问作者Alex Woolfe
相关产品推荐
相关产品推荐

