动手数据分析第二章Task02

2.1数据清洗及特征处理

加载数据train.csv

df = pd.read_csv('./train.csv')

 2.1缺失值的观察与处理

2.1.1观察缺失值

# 查看每个特征缺失值个数
df.info()
df.isnull().sum()

# 查看指定列的数据
df[['Age', 'Cabin', 'Embarked']].head()

 2.1.2处理缺失值

一般做法:

dropna函数:丢掉缺失值,删除所在行或者列。

fillna()函数:填充缺失值,填充为0或者指定是数。

df[df['Age']==None]=0   # nan值赋值为0
df[df['Age'].isnull()]=0 
df[df['Age']==np.nan]=0

检索空缺值用np.nan,None以及.isnull() 相比,np.nan最好,因为数值列读取数据后,空缺值的数据类型为float64所以用None一般索引不到。

# 删除有缺失值的行
df.dropna()

# 指定列填充制定数值
values = {'Age':20}
df.fillna(value=values)  # 将Age列的缺失值都填充为20,参数limit=1限制只填充前1行
df.fillna(0)          # 都填充为0

 2.2重复值观察与处理

2.2.1 查看数据中的重复值

duplicated()函数:返回布尔值主要参数:

subset=['Age',‘Cabin’]:指定列进行查重,两列条件都满足,两列都相同则返回。

keep={

first: 除第一次出现的重复值,其他都标记为True.

last: 除最后一次出现的重复值,其他都标记为True.

False:所有重复值都标记为True.}

df[df.duplicated()]      # 查看所有重复的项

 2.2.2 处理重复值

df = df.drop_duplicates()     # 把重复的值都删掉

2.2.3 将前面清洗的数据保存为csv格式

df.to_csv('test_clear.csv')

 2.3 特征观察与处理

我们对特征进行一下观察,可以把特征大概分为两大类:
数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征,数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。

文本型特征往往需要转换成数值型特征才能用于建模分析。

2.3.1 对连续型数值离散化处理(分箱操作)

分箱操作:把数据按特定的规则进行分组,实现数据的离散化,增强数据稳定性,减少过拟合风险。

# 方法一:将连续变量年龄平均分为五个年龄段
df['AgeBand'] = pd.cut(df["Age"], 5, labels=[1, 2, 3, 4, 5])

# 方法二:指定年龄分组,分为五组
df['AgeBand'] = pd.cut(df["Age"], [0, 5, 15, 30, 50, 80], labels=[1, 2, 3, 4, 5])

# 方法三: 按照百分比进行分组
df['AgeBand'] = pd.qcut(df["Age"], [0, 0.1, 0.3, 0.5, 0.7, 0.9], labels=[1, 2, 3, 4, 5])

 2.3.2:对文本变量处理

(1)查看指定列的种类及个数

# 方法一:value_counts函数返回种类类别及个数
df['Sex'].value_counts()
df['Cabin'].value_counts()
df['Embarked'].value_counts()

# 方法二:unique查看类别名称
df['Sex'].unique()

# 方法三:nunique,返回int值表示类别个数

(2)文本变量数值化处理

#方法一: replace
df['Sex_num'] = df['Sex'].replace(['male','female'], [1, 2])   # male改为1,female改为2


# 方法二:map:根据键值对修改
df["Sex_num"] = df['Sex'].map({'male':1, 'female':2})


#当类别数目过多时,使用下面批量操作
# 方法三:使用sklearn库里面的preprocessing.LabelEncoder
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:
    lbl = LabelEncoder()  
    label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique())))   # 从0开始给种类名称赋值
    df[feat + "_labelEncode"] = df[feat].map(label_dict)
    df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str))


(3)用one-hot编码表示

使用独热编码去除冗余特征

(3.1)数值型变量

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import LabelBinarizer
from sklearn.preprocessing import MultiLabelBinarizer
 
testdata = pd.DataFrame({'pet': ['cat', 'dog', 'dog', 'fish'],'age': [4 , 6, 3, 3],
'salary':[4, 5, 1, 1]})

 sklearn:

a1 = OneHotEncoder(sparse = False).fit_transform( testdata[['age']] )
a2 = OneHotEncoder(sparse = False).fit_transform( testdata[['salary']])
final_output = numpy.hstack((a1,a2))



array([[ 0.,  1.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  1.],
       [ 1.,  0.,  0.,  1.,  0.,  0.],
       [ 1.,  0.,  0.,  1.,  0.,  0.]])

先对age进行one-hot二值化:

OneHotEncoder(sparse = False).fit_transform(testdata[['age']])



array([[ 0.,  1.,  0.],
       [ 0.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 1.,  0.,  0.]])

同样对salary进行二值化最后把两个one-hot进行拼接: 

 pandas:

pd.get_dummies(testdata, columns=testdata.columns)

(3.2) 文本字符型

sklearn.OneHotEncoder无法直接对字符串型的类别变量编码,OneHotEncoder().fit_transform(testdata[[‘pet’]])这句话会报错。

∴方法1:先用 LabelEncoder() 转换成连续的数值型变量,再用 OneHotEncoder() 二值化。

方法2:直接用 LabelBinarizer() 进行二值化。

# 方法一: LabelEncoder() + OneHotEncoder()
a = LabelEncoder().fit_transform(testdata['pet'])
OneHotEncoder( sparse=False ).fit_transform(a.reshape(-1,1)) # 注意: 这里把 a 用 reshape 转换成 2-D array
 
# 方法二: 直接用 LabelBinarizer()
 
LabelBinarizer().fit_transform(testdata['pet'])


LabelEncoder和LabelBinarizer设计为只支持 1-D array,也使得它无法像上面 OneHotEncoder 那样批量接受多列输入,也就是说LabelEncoder().fit_transform(testdata[[‘pet’, ‘age’]])会报错



所以还是使用pandas里面的get_dummies比较直接:
pd.get_dummies(testdata, columns=testdata.columns)

2.3.3:从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)

方法1:正则表达式提取

df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)
df.head()
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值