Datawhale 数据分析打卡2-数据清洗及特征处理

数据清洗及特征处理

    • 一. Why clean data?
    • 二. 数据清洗
    • 三. 特征观察与处理
    • 四. 总结

一. Why clean data?

在导入数据并进行一些初始操作对数据有一个初步认识之后,需要开始数据清洗以及重构,将原始数据变为一个更好用的数据,为之后放入模型做准备。

二. 数据清洗

在原始数据集中经常会出现缺失值,异常点等,如果将这些数据直接放入模型中进行训练,肯定会影响训练效果。所以说要对raw data进行清洗将其变成可分析的数据集
常用的函数和功能:

查看缺失值
首先要查看下哪些列有较多的缺失值:

	#查阅每列数据总的缺失值个数
	t_data.isnull().sum()
	t_data.isna().sum()

填充或者删去缺失值

#提醒:可使用的函数有--->dropna函数与fillna函数
#dropna函数 删除含有缺失值的行或列
t_data.dropna(axis=0,subset=['Age','Ticket'],how = 'any')
# 参数1: axis : 0表示行,1表示列
# 参数2:subset  在某组列中搜索缺失值 若axis为行,则subset为列索引,反之亦然
# 参数3:how : any表示设定组列中存在缺失就去除此行/列,
# all表示组列中若全为缺失值则剔除此行/列

#fillna 填充缺失值
t_data['Column_name'].fillna(method='ffill').head(5)
# 变量:method ='ffill'/'backfill'前向填充/后向填充
# 也可以直接在()内填写其他值填充

重复值观察与处理

#查看重复值
t_data[t_data.duplicated()]
#默认保留第一个数据,删除剩下的重复值
t_data.drop_duplicates(subset=['Age'])

三. 特征观察与处理

特征大概分为两大类:
数值型特征:离散型数值特征,连续型数值特征
文本型特征:类别型文本特征
数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。

对连续变量进行离散化(分箱)处理的三种方法

#分箱操作是什么:
#将连续变量分到不同箱子里成为离散型变量

#将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示 
#然后将分类结果储存在新列AgeBand中
t_data['AgeBand'] = pd.cut(t_data['Age'],5,labels=['1','2','3','4','5'])

#Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段
t_data['AgeBand'] = pd.cut(t_data['Age'],[0,5,15,30,50,80],labels=['1','2','3','4','5'])

#将连续变量Age按10% 30% 50 70% 90%五个年龄段
t_data['AgeBand'] = pd.qcut(t_data['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels=['1','2','3','4','5'])

将文本型特征转换成数值型特征的方法

# 查看文本变量名及种类
#return series
t_data['Column_name'].value_counts()
 
#return series
t_data['Column_name'].unique()

#return numbers of different data types
t_data['Sex'].nunique()

#方法一: replace
#Replace 'male' and 'female' with 1 and 2 in the Column named 'Sex' , 
# then store the label results in a new column named Sex_num
t_data['Sex_num'] = t_data['Sex'].replace(['male','female'],[1,2])

#方法二: map
t_data['Sex_num'] = t_data['Sex'].map({'male':1,'female':2})

#方法三: 使用sklearn.preprocessing的LabelEncoder
#suitable for features with many text types
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:
    lbl = LabelEncoder()  
    label_dict = dict(zip(t_data[feat].unique(), range(t_data[feat].nunique())))
    t_data[feat + "_labelEncode"] = t_data[feat].map(label_dict)
    t_data[feat + "_labelEncode"] = lbl.fit_transform(t_data[feat].astype(str))

从纯文本特征中提取出想要的特征


t_data['Title'] = t_data.Name.str.extract('([A-Za-z]+)\.',expand=True)
# 第一个函数变量([A-Za-z]+)\.表示(大小写字母+.),对应人名中Titles的特征
# expand = True 返回series数据类型
# expand = False 返回DataFrame数据类型

四. 总结

通过对raw data里的缺失值进行补充或剔除,将连续特征和文本特征进行离散化后特别有利于后续的数据可视化分析,提取出有价值的特征来进行之后的模型训练。

你可能感兴趣的:(Pandas,数据分析,python)