目录
一、缺失值填补 impute.SimpleImputer函数
1.3 在这里我们使用中位数填补Age,用众数填补Embarked:
引言
机器学习和数据挖掘中所使用的数据,永远不可能是完美的。很多特征,对于分析和建模来说意义非凡,但对于实际收集数据的人却不是如此,因此数据挖掘之中,常常会有重要的字段缺失值很多,但又不能舍弃字段的情况。因此,数据预处理中非常重要的一项就是处理缺失值。
我们采用从泰坦尼克号提取出来的数据,这个数据有三个特征,如下:
- Age 数值型
- Sex 字符型
- Embarked 字符型
import pandas as pd
#index_col=0是因为原数据中第1列本就是索引
data = pd.read_csv(r"..\datasets\Narrativedata.csv",index_col=0)
data.head()
一、缺失值填补 impute.SimpleImputer函数
class sklearn.impute.SimpleImputer(
missing_values=nan,
strategy="mean",
fill_value=None,
verbose=0,
copy=True
)
1.1 Simplelmputer四个重要参数
这个类是专门用来填充缺失值的。它包括四个重要参数:
>missing_values:告诉Simplelmputer,数据中的缺失值长什么样,默认空值np.nan
>strategy
我们填补缺失值的策略,默认均值
输入"mean"使用均值填补(仅对数值型特征可用)
输入"median"用中值填补(仅对数值型特征可用)
输入"most_frequent"用众数进行填补(对数值型和字符型特征都可用)
输入"constant"表示请参考参数"fill_value"中的值(对数值型和字符型特征都可用)
>fill_value
当参数startegy为"constant"的时候可用,可输入字符串或数字表示要填充的值,常用0
>copy
默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去
import pandas as pd
#index_col=0是让计算机知道原数据中第一列样本是索引
data=pd.read_csv((r"..\datasets\Narrativedata.csv",index_col=0)
data.head()
data.info()
#由运行结果可知Age和Embarked有缺失值
"""
<class 'pandas.core.frame.DataFrame'>
Int64Index: 891 entries, 0 to 890
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Age 714 non-null float64
1 Sex 891 non-null object
2 Embarked 889 non-null object
3 Survived 891 non-null object
dtypes: float64(1), object(3)
memory usage: 34.8+ KB
"""
#查看数据
#查看数据
Age=data.loc[:,"Age"].values.reshape(-1,1) #sklearn当中的矩阵必须是二维的
Age[:20]
"""
array([[22.],
[38.],
[26.],
[35.],
[35.],
[nan],
[54.],
[ 2.],
[27.],
[14.]])
1.2 用各个值填补演示
from sklearn.impute import SimpleImputer
import pandas as pd
data=pd.read_csv((r"..\datasets\Narrativedata.csv",index_col=0)
Age=data.loc[:,"Age"].values.reshape(-1,1)
imp_median=SimpleImputer(strategy="median")#用中位数填补
imp_median=imp_median.fit_transform(Age)#中值填补
imp_0=SimpleImputer(strategy="constant",fill_value=0)#用零填补
imp_0=imp_0.fit_transform(Age) #使用0填补
imp_median[:10] #查看用中值填补后的前20条数据
imp_0[:10] #查看用0填补后的前20条数据
1.3 在这里我们使用中位数填补Age,用众数填补Embarked:
from sklearn.impute import SimpleImputer
#在这里我们使用中位数填补Age
data.loc[:,"Age"]=imp_median
#使用众数填补Embarked
Embarked=data.loc[:,"Embarked"].value.reshape(-1,1)
imp_mode=SimpleImputer(strategy="most_frequent")
data.loc[:,"Embarked"]=imp_mode.fit_transform(Embarked)
data.info()
#由结果可知填补已经完成了
"""
<class 'pandas.core.frame.DataFrame'>
Int64Index: 891 entries, 0 to 890
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Age 891 non-null float64
1 Sex 891 non-null object
2 Embarked 891 non-null object
3 Survived 891 non-null object
dtypes: float64(1), object(3)
memory usage: 34.8+ KB
"""
# data.head(20) #显示填补后的前20条数据
1.4 用Pandas和Numpy进行填补其实更加简单
import pandas as pd
data=pd.read_csv(r"数据地址")
data.head()
data.loc[:,"Age"]=data.loc[:,"Age"].fillna(data.loc[:,"Age"].median())
#.fillna在DataFrame里面直接进行填补
data.dropna(axis=0,inplace=True)
#.dropna(axis=0)删除所有缺失值的行, .dropna(axis=1)删除所有缺失值的列
#参数inplace,为True表示在原数据集上进行修改,为False表示生成一个复制对象,不修改原数据,默认为Flase