一、前言
上一节已经对这次的实战北京做了介绍,这一节主要介绍数据清洗。
唯一的就是,今天大年三十,祝大家新年快乐,来年事业、家庭都能如意!!!
二、实战-数据清洗
导入库
#导入库
import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline
加载并合并数据集,合并一起,方便清洗
data_test = pd.read_csv('test.csv') data_train = pd.read_csv('train.csv') data_train['status'] = 'train' data_test['status'] = 'test' #data_train = data_train.drop(['Survived'],axis=1) df_data = pd.concat([data_train,data_test],axis=0,ignore_index=True)
看一下合并后的情况
df_data.head(4)
1、Pclass
上一节中,我们可以看到,船舱的等级越高,存活的越多,这里我做了一下onehot
df_pclass = pd.get_dummies(df_data.Pclass,prefix='Pclass')#onehot df_data = pd.concat([df_data,df_pclass],axis=1,ignore_index=False)#把onehot的数据合并到df_data中 df_data.drop(['Pclass'],axis=1,inplace=True)#把原来的列Pclass删除
2、Name、Ticket
这个感觉不用处理,直接删除就好。
df_data.drop(['Name','Ticket'],axis=1,inplace=True)
3、Cabin 空的太多,懒得弄了,也直接干掉
df_data.drop(['Cabin'],axis=1,inplace=True)
4、Sex,map处理一下
df_data.Sex = df_data.Sex.map({'male':0,'female':1})#male变成0,female变成1
5、Age
Age还有很多空的,先暴力填充一下平局值
df_data.Age.fillna(df_data.Age.mean(),inplace=True)
然后再分段处理
def get_age(age): if 0<age <= 8: return 0 if 8<age<=15: return 1 if 15<age<=22: return 2 if 22<age<=30: return 3 if 30<age<=38: return 4 if 38<age<=48: return 5 if 48<age<=58: return 6 if 58<age: return 7 else: return 8
df_data.Age = df_data.Age.apply(get_age)
因为之前分析,发现Age这个和存活不是线性关系,所以做一下onehot吧
df_age = pd.get_dummies(df_data.Age,prefix='Age') df_data = pd.concat([df_data,df_age],axis=1) df_data.drop(['Age'],inplace=True,axis=1)
6、SibSp
df_data.SibSp.value_counts()
这里可以看到,大于3的其实很少,把大于3的都归为一类吧
df_data.SibSp = df_data.SibSp.map(lambda x:x if x <3 else 3)
再做一下onehot encoding
df_sibsp = pd.get_dummies(df_data.SibSp,prefix='SibSp') df_data = pd.concat([df_data,df_sibsp],axis=1)
7、Parch
和上面一样的处理方法
df_data.Parch = df_data.Parch.map(lambda x:x if x<3 else 3) df_Parch = pd.get_dummies(df_data.Parch,prefix='Parch') df_data = pd.concat([df_data,df_Parch],axis=1)
8、增加一列,family
df_data['Family'] = df_data.Parch + df_data.SibSp df_data.Family = df_data.Family.map(lambda x:x if x<3 else 3) df_Family = pd.get_dummies(df_data.Family,prefix='Family') df_data.drop(['Parch','SibSp','Family'],axis=1,inplace=True)
9、Embarked 这个处理 one-hot一下吧
df_embarked = pd.get_dummies(df_data.Embarked,prefix='embarked') df_data = pd.concat([df_data,df_embarked],axis=1) df_data.drop(['Embarked'],axis=1,inplace=True)
10、Fare做一下归一化
因为有空值,先填充平均值,在除以平均值做一下归一化,也可以用StandardScaler做
df_data.Fare.fillna(df_data.Fare.mean(),inplace=True) df_data.Fare = df_data.Fare/df_data.Fare.mean()
11、PassengerId 干掉
df_data.drop(['PassengerId'],axis=1,inplace=True)
12、清理完成,保存
df_train = df_data.loc[df_data.status == 'train'] df_test = df_data.loc[df_data.status == 'test']
df_train.to_csv('df_train.csv',index=False)
df_test.to_csv('df_test.csv',index=False)
至此,清理工作完成,当然也可以发挥想象力,做其他处理