查看数据缺失情况:
data.isnull()##元素级别的判断,把对应的所有元素的位置都列出来,元素为空或者NA就显示True,否则就是False
df.isnull().any()##列级别的判断,只要该列有为空或者NA的元素,就为True,否则False
data[data.isnull().values==True]##可以只显示存在缺失值的行列,清楚的确定缺失值的位置。
data.columns[data.isnull().any()].tolist() #data是dataframe对象,将为空或者NA的列找出来
data.isnull().sum() ##将列中为空的个数统计出来
通常遇到缺值的情况,我们会有几种常见的处理方式
1.如果缺值的样本占总数比例极高,我们可能就直接舍弃了,作为特征加入的话,可能反倒带入noise,影响最后的结果了。
2.如果缺值的样本适中,而该属性非连续值特征属性(比如说类目属性),那就把NaN作为一个新类别,加到类别特征中
3.如果缺值的样本适中,而该属性为连续值特征属性,有时候我们会考虑给定一个step(比如这里的age,我们可以考虑每隔2/3岁为一个步长),然后把它离散化,之后把NaN作为一个type加到属性类目中。
4.有些情况下,缺失的值个数并不是特别多,那我们也可以试着根据已有的值,拟合一下数据。
5.一些情况下,可以根据缺失类别情况来直接用数值填补。
对于第一种,舍弃
missing_age = train_test.drop(['Survived','Cabin','Ticket','Name'],axis=1)##删除对应列,survived,cabin等各列
对于第二种,将缺失数据变成新类别
data_train.loc[ (df.Cabin.notnull()), 'Cabin' ] = "Yes" ##将df数据的df.cabin的非空数据转换成yes
data_train[ (df.Cabin.isnull()), 'Cabin' ] = "No" ##将df数据的df。cabin的空白数据转换成no
##将数据yes补全成为1,no补全成为0,并且将数据此列分为两列,前缀是'Cabin'
dummies_Cabin = pd.get_dummies(data_train['Cabin'], prefix= 'Cabin')
对于第三种情况,待续
对于第四种情况,根据已经有的数据进行拟合
age_df=df[['Age','Fare','Parch','SibSp','Pclass']] ##预测数据y和特征变量x
known_age = age_df[age_df.Age.notnull()].values ##将已经拥有的age数据变为训练集
unknown_age=age_df[age_df.Age.isnull()].values ##将空缺age的数据变成测试集
##y即为目标年龄
y=known_age[:,0]
##X为特征属性值
X=known_age[:,1:]
#fit到random forest,使用随机森林算法预测
rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)
rfr.fit(X, y)
# 用得到的模型进行未知年龄结果预测
predictedAges = rfr.predict(unknown_age[:, 1:])
# 用得到的预测结果填补原缺失数据
df.loc[(df.Age.isnull()), 'Age'] = predictedAges