SimpleImputer处理含np.nan与np.inf数据报错,求解决方案
解决ValueError:同时填充np.nan和np.inf为0的方案
这个报错的核心原因很明确:SimpleImputer默认只会将np.nan识别为需要填充的缺失值,而你的数据里存在的np.inf(正无穷)或-np.inf(负无穷)不在它的处理范围内,导致拟合转换时触发了数值类型错误。
下面给你两种靠谱的解决办法,按需选择:
方法一:先转换inf为nan,再用SimpleImputer处理
如果你需要配合后续的scikit-learn流程,必须用SimpleImputer,可以先把所有无穷值转换成np.nan,再统一填充:
import numpy as np import pandas as pd from sklearn.impute import SimpleImputer # 第一步:把所有inf和-inf替换成nan data_fe = data_fe.replace([np.inf, -np.inf], np.nan) # 第二步:用SimpleImputer填充nan为0 imputer = SimpleImputer(missing_values=np.nan, strategy='constant', fill_value=0) features_to_impute = data_fe.columns.tolist() # 重置列名和索引,避免转换后数据结构混乱 data_fe[features_to_impute] = pd.DataFrame( imputer.fit_transform(data_fe[features_to_impute]), columns=features_to_impute, index=data_fe.index )
方法二:用Pandas直接一步到位(更简洁高效)
如果你的流程不需要依赖sklearn的Imputer,用Pandas原生方法会更简单,能一次性处理np.nan、np.inf和-np.inf:
import numpy as np import pandas as pd # 方案A:先替换inf为nan,再统一填充0 data_fe = data_fe.replace([np.inf, -np.inf], np.nan).fillna(0) # 方案B:直接用replace一次性替换所有目标值 data_fe = data_fe.replace([np.nan, np.inf, -np.inf], 0)
小提示
如果你使用的是scikit-learn 0.23及以上版本,也可以尝试直接指定missing_values参数为元组,让SimpleImputer同时识别nan和inf:
imputer = SimpleImputer(missing_values=(np.nan, np.inf, -np.inf), strategy='constant', fill_value=0)
不过这个方法在旧版本scikit-learn中可能不支持,所以先转换inf为nan或者用Pandas方法会更稳妥。
内容的提问来源于stack exchange,提问作者Maths12
相关产品推荐
相关产品推荐

