1.导入数据
import pandas as pd
X = pd.read_csv('train.csv')
Y = pd.read_csv('test.csv')
2.查看数据
X.info()
3.计算每列的缺失率,并按缺失率降序排序
null_num = X.shape[0] - X.count() #计算每列的缺失数
null_num_rate = null_num / X.shape[0] #缺失率
null_num_df = pd.concat([null_num, null_num_rate],axis=1)
null_num_df.columns=['num','rate']
null_num_df = null_num_df.sort_values(by = ['rate'], ascending = False) #对缺失率降序排序
4. 直接删除缺失率多的标签
X=X.drop(['PoolQC','MiscFeature','Alley','Fence','FireplaceQu'],axis=1)
5. 对指定的列填充缺失值‘None’
col=['GarageType','GarageQual','GarageCond','GarageFinish','BsmtExposure','BsmtFinType2','BsmtQual','BsmtCond','BsmtFinType1']
X[col]=X[col].fillna('None')
6. 其中GarageYrBlt为车库的年份,用房子的建造年份来替代
X.loc[X['GarageYrBlt'].isnull(),'GarageYrBlt']=X[X['GarageYrBlt'].isnull()]['YearBuilt']
7. 用中位数替换‘LotFrontage’的缺失值
X.loc[X['LotFrontage'].isnull(),'LotFrontage']=X['LotFrontage'].mean(skipna=True)
8. 变量 MasVnrType 外墙装饰材料
这个变量对价钱的影响应该不大,MasVnrType中的NA用它本身的None来代替
X['MasVnrType']=X['MasVnrType'].fillna('None')
9. 变量 MasVnrArea 外墙装饰材料的面积
这个缺失值对应着MasVnrType的None值,应该将NA用0来替代
X['MasVnrArea']=X['MasVnrArea'].fillna(0)
10. 变量 Utilities 没有区分度,直接丢弃
X=X.drop('Utilities',axis=1)
11. 变量 BsmtFullBath BsmtHalfBath BsmtFinSF1 BsmtFinSF2 BsmtUnfSF TotalBsmtSF GarageCars GarageArea 则是由于不存在相应的设施而缺失,这些变量都是数字变量,所以都补充为0即可。
cols=['BsmtFullBath','BsmtHalfBath','BsmtFinSF1','BsmtFinSF2','BsmtUnfSF','TotalBsmtSF','GarageCars','GarageArea']
X[cols]=X[cols].fillna(0,axis=1)
12. 变量MSZoning,Functional,Exterior1st,Exterior2nd,KitchenQual,Electrical,SaleType
这些变量都是因子变量,并且只有几个缺失值,直接用最多的因子(出现频率最高的)来代替
def select(x):
#print(x)
a=x.mode().values[0]
return x.fillna(a)
X[cols]=X[cols].apply(fun)