#加载所需的库
import numpy as np
import pandas as pd
#加载数据train.csv
df = pd.read_csv('train.csv')
df.head(3)
我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值和异常点等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗,本次我们将学习缺失值、重复值、字符串和数据转换等操作,清洗数据为后续的数据分析和建模做准备。
有很多方法可以查看缺失值:
df.info()
通过观察,可以发现 Age, Cabin, Embarked 都存在缺失值。
df.isnull().sum()
df[df['Age']==None]=0
df.isnull().sum()
df[df['Age'].isnull()] = 0
df.isnull().sum()
df[df['Age'] == np.nan] = 0
df.isnull().sum()
确定丢弃包含缺失值的行还是列
如果为True,丢弃缺失值操作将原地进行,并返回 None。
如果 inplace 为 False,返回丢弃了缺失值的 DataFrame,否则返回None。
df.dropna().info()
观察发现,最后只有183条可用数据,证明这种做法很浪费数据。
用来填充缺失值的值,可以是标量、字典、Series 或 DataFrame。
按行或列方向填充缺失值
是否原地执行操作
对于连续的缺失值被最多填充个数,缺省值是无个数限制
如果 inplace 为 False,返回填充了缺失值的 DataFrame,否则返回None
df.fillna(0).info()
df[df.duplicated()]
df = df.drop_duplicates()
df.to_csv('test_clear.csv')
我们对特征进行一下观察,可以把特征大概分为两大类:
数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征。
数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。
df['AgeBand'] = pd.cut(df['Age'], 5,labels = [1,2,3,4,5])
df.head()
df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],labels = [1,2,3,4,5])
df.head(3)
df['AgeBand'] = pd.qcut(df['Age'],[0,0.2,0.4,0.6,0.8,1],labels = [1,2,3,4,5])
df.head()
df['Sex'].value_counts()
df['Sex'].unique()
df['Sex'].nunique()
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2])
df.head()
for feat in ['Cabin', 'Ticket']:
label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique())))
df[feat + "_labelEncode"] = df[feat].map(label_dict)
df.head()
df['Cabin_labelEncode'].value_counts()
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:
lbl = LabelEncoder()
df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str))
df.head()
df['Cabin_labelEncode'].value_counts()
可以发现,采用 map 方法与采用 LabelEncoder 方法的编码结果还是有区别的,这是因为不同的方法给相同的文本变量赋予了不同的数值。
for feat in ["Sex", "Embarked"]:
x = pd.get_dummies(df[feat], prefix=feat)
df = pd.concat([df, x], axis=1)
df.head()
from sklearn.preprocessing import OneHotEncoder
onehot_model = OneHotEncoder(handle_unknown='ignore')
onehot_features= ["Sex", "Embarked"]
onehot_model.fit(df[onehot_features].astype(str))
after_onehot_features = onehot_model.get_feature_names(onehot_features)
data_train_onehot = pd.DataFrame(onehot_model.transform(df[onehot_features]).toarray(),columns=after_onehot_features)
df = df.join(data_train_onehot)
df.head()
注意,使用 get_dummies 得到的独热编码的数据类型为 uint8,
使用 OneHotEncoder 得到的独热编码的数据类型为 float64。
df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)
df.head()