使用SimpleImputer均值策略遇ValueError,非数值数据转换失败求助
解决方案
问题根源
报错核心原因是:SimpleImputer的mean填充策略仅支持数值型数据,但你的数据集包含字符串类型列(比如OWN_OCCUPIED列中的'PUTNAM'),直接对整个DataFrame执行均值填充必然失败。
修复步骤
1. 优化OWN_OCCUPIED列的NaN替换
你之前用循环判断的代码可以简化,用pandas内置方法更高效:
import pandas as pd import numpy as np # 读取数据(假设missing_val已定义) sample_real_state = pd.read_csv('Sample_real_estate_data.csv', na_values=missing_val) # 将OWN_OCCUPIED中可转为整数的内容替换为NaN sample_real_state['OWN_OCCUPIED'] = pd.to_numeric(sample_real_state['OWN_OCCUPIED'], errors='coerce').astype('object')
2. 拆分数值列与分类列
把数据集分成数值型和字符串(分类)型两部分,分别处理缺失值:
# 分离数值列和分类列 numeric_cols = sample_real_state.select_dtypes(include=['int64', 'float64']).columns categorical_cols = sample_real_state.select_dtypes(include=['object']).columns numeric_data = sample_real_state[numeric_cols] categorical_data = sample_real_state[categorical_cols]
3. 分别填充缺失值
- 数值列用
mean策略填充 - 分类列可选择
most_frequent(众数)或constant(自定义值)策略填充
from sklearn.impute import SimpleImputer # 处理数值列缺失值 imp_mean = SimpleImputer(strategy='mean') numeric_imputed = imp_mean.fit_transform(numeric_data) numeric_imputed_df = pd.DataFrame(numeric_imputed, columns=numeric_cols) # 处理分类列缺失值(以众数为例,也可替换为constant策略) imp_mode = SimpleImputer(strategy='most_frequent') categorical_imputed = imp_mode.fit_transform(categorical_data) categorical_imputed_df = pd.DataFrame(categorical_imputed, columns=categorical_cols)
4. 合并处理后的数据集
# 合并数值列和分类列 final_data = pd.concat([numeric_imputed_df, categorical_imputed_df], axis=1) # 恢复原数据集的列顺序(可选) final_data = final_data[sample_real_state.columns]
额外说明
如果需要对特定列用自定义值填充(比如你代码里的fill_value="work from home"),可单独处理该列:
# 对OWN_OCCUPIED列用自定义值填充缺失值 sample_real_state['OWN_OCCUPIED'] = sample_real_state['OWN_OCCUPIED'].fillna("work from home")
内容的提问来源于stack exchange,提问作者HARSH PATEL
相关产品推荐
相关产品推荐

