动手学数据分析Task2第一节数据清洗及特征处理
第二章:数据清洗及特征处理
我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗,本章我们将学习缺失值、重复值、字符串和数据转换等操作,将数据清洗成可以分析或建模的亚子。
开始之前,导入numpy、pandas包和数据:
import pandas as pd
import numpy as np
train = pd.read_csv('./train.csv')
目录
第二章:数据清洗及特征处理
2.1 缺失值观察与处理
2.1.1 任务一:缺失值观察
2.1.2 任务二:对缺失值进行处理
2.2 重复值观察与处理
2.2.1 任务一:请查看数据中的重复值
2.2.2 任务二:对重复值进行处理
2.2.3 任务三:将前面清洗的数据保存为csv格式
2.3 特征观察与处理
2.3.1 任务一:对年龄进行分箱(离散化)处理
2.3.2 任务二:对文本变量进行转换
2.3.3 任务三:从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)
总结:
2.1 缺失值观察与处理
2.1.1 任务一:缺失值观察
(1) 查看每个特征缺失值个数
方法一:通过info()查看整个数据基本信息
train.info()
可以看出字段‘Age’、‘Cabin’、‘Embarked’中存在缺失值。
方法二:使用isnull().sum()汇总每一列的缺失值总数:
train.isnull().sum()
可以一目了然的看出字段‘Age’、‘Cabin’、‘Embarked’中存在多少缺失值。
(2) 请查看Age, Cabin, Embarked列的数据
train[['Age','Cabin','Embarked']].head()
train.iloc[:,[5,10,11]].head()
2.1.2 任务二:对缺失值进行处理
(1)处理缺失值一般有几种思路
面对缺失值考虑有三种处理方法:
1. 去掉含有缺失值的样本(行)
可使用DataFrame.dropna(axis=0, how=‘any’, thresh=None, subset=None, inplace=False)直接删除带有缺失值的行;
2. 将含有缺失值的列(特征向量)去掉
可使用pd.dropna()、drop()进行删除,但若该特征值属于重要特征,则对后期模型预测结果影响较大;
3. 将缺失值用某些值填充(0,平均值,中值等)
使用DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)对缺失值进行赋值。
(2) 请尝试使用不同的方法直接对整张表的缺失值进行处理
在train中我们可以使用三种不同的方法对含有缺失值的‘Age’、‘Cabin’、‘Embarked’三个特征值进行处理:
1. Cabin的缺失值较多,影响后续分析,可以考虑将此列去除
train1 = train.drop(['Cabin'],axis=1)
2. Age存在部分缺失值,可以考虑用Age现在的中位数进行填补
Age_median = train['Age'].median()
train1['Age'] = train1['Age'].fillna(Age_median)
3. Embarked所缺少的值较少且为字符型数据,可以考虑将缺失值所在的样本删除,以防影响后续分析
train1 = train1.dropna(subset=['Embarked'])
我们info()查看train1数据现在基本信息,发现现在已经不存在缺失值了:
train1.info()
describe()比较下‘Age’的数据变化情况,可以观察到平均值的变化较小,数据离散程度减小。
【思考1】dropna和fillna有哪些参数,分别如何使用呢?
1. pd.dropna()
- axis=1/0 选择删除包含缺失值的行或者列;
- how=‘any’ :只要有缺失值出现,就删除该行或列;
- how=‘all’: 所有的值都缺失,才删除行或列;
- thresh: axis中至少有thresh个非缺失值,否则删除该行或列;
- (例如:axis=0,thresh=10:标识如果该行中非缺失值的数量小于10,将删除改行)
- subset: list在哪些列中查看是否有缺失值
- inplace: 是否在原数据上操作,如果为真,返回None否则返回新的copy,去掉了缺失值。
2. pd.fillna()
- value: 被填充的数据,scalar、dict、Series、DataFrame
- method: {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None,在列上进行操作,
- ffill / pad: 使用前一个值来填充缺失值,
- backfill / bfill :使用后一个值来填充缺失值;
- limit: 填充的缺失值个数限制;
- axis=1/0 选择删除包含缺失值的行或者列;
- inplace:default False,True表示修改原文件。
来源:pandas 处理缺失值[dropna、drop、fillna]_mythyyya的博客-CSDN博客_pandas可以用dropna和fillna来处理缺省值的函数
补充:https://blog.csdn.net/qq_42642945/article/details/88637457?ops_request_misc=&request_id=&biz_id=102&utm_term=pandas%E5%A4%84%E7%90%86%E7%BC%BA%E5%A4%B1%E5%80%BC%E6%80%9D%E8%B7%AF&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-88637457.pc_search_em_sort&spm=1018.2226.3001.4187
【思考2】检索空缺值用`np.nan`,`None`以及`.isnull()`哪个更好,这是为什么?如果其中某个方式无法找到缺失值,原因又是为什么?
首先分别使用np.nan\None\isnull()进行处理:
1.train.loc[0,['Cabin']] is None
2.train.loc[0,['Cabin']]
3.train.isna().sum()
4.train.isnull().sum()
得到:
1.False2.Cabin NaN
Name: 0, dtype: object3.PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int644.PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
1. 可以看出np.nan为非空对象,其类型为基本数据类型float,用 np.nan is None判断是False;
2. np.isnan()和pd.isnull()都可以对DataFrame进行空值检测。
但一般在实际应用中,np.isnan()多用于单个值的检验,pd.isnull()用于对一个DataFrame或Series(整体)的检验。
来源:用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())_甘如荠-CSDN博客_numpy.isnan
2.2 重复值观察与处理
pandas提供了两个方法专门用来处理数据中的重复值,分别为duplicated()和drop_duplicates()方法。
2.2.1 任务一:请查看数据中的重复值
方式:duplicated(subset=None,keep=“first”)
- subset:用于识别重复的列标签或列标签序列,默认识别所有的列标签。
- keep:表示删除重复值后保留的数据,默认是保留第一条数据
- first:从前向后查找,除了第一次出现外,其余相同的被标记为重复。
- last:从后向前查找,除了最后一次出现外,其余相同的被标记为重复。
- False:所有相同的都标记为重复。
查看已处理过缺失值的train1中的重复值,发现并没有重复值:
train1.duplicated().value_counts()#输出:
False 889
dtype: int64
用自定义函数查看每一列的重复值:
columns=list(train1.columns)def dul(columns,df):for i in columns:duplicated = df[i].duplicated().value_counts()display(duplicated)print('\n')dul(columns,train1)#输出:
True 889
Name: Survived, dtype: int64True 889
Name: Pclass, dtype: int64False 889
Name: Name, dtype: int64True 889
Name: Sex, dtype: int64True 873
False 16
Name: Age, dtype: int64True 889
Name: SibSp, dtype: int64True 888
False 1
Name: Parch, dtype: int64False 547
True 342
Name: Ticket, dtype: int64True 792
False 97
Name: Fare, dtype: int64True 889
Name: Embarked, dtype: int64
发现每一列中只要有存在重复值就被标记为False,没有办法清楚的看出每个重复值,之后考虑用value_counts()查看一些特征值的重复值:
cats = train1[['Pclass','Sex', 'Embarked']]def dul1(columns,df):for i in columns:duplicated = df[i].value_counts()display(duplicated)print('\n')dul1(cats,train1)#输出:
3 491
1 214
2 184
Name: Pclass, dtype: int64male 577
female 312
Name: Sex, dtype: int64S 644
C 168
Q 77
Name: Embarked, dtype: int64
2.2.2 任务二:对重复值进行处理
(1)重复值有哪些处理方式呢?
方法:考虑通过drop_duplicates(subset=None,keep=“first”,inplace=False,ingore_index=False)方法处理重复值
- subset:表示按照指定的一个或者多个列属性来删除重复值,可选性;默认是全部列属性
- keep:表示删除重复值后保留的数据,默认是保留第一条数据,first/last
- inplace:表示删除重复是生成副本,还是直接在原数据上进行修改,True/False
- ignore_index:该参数表示的是生成数据的索引是原数据的索引还是直接重新排名,生成数据的索引是元数据的,还是从0,1,2...到n-1的自然数排列,True/False
因为train1中不含重复值,所以重新建立一个DataFrame:
data = pd.DataFrame(np.random.randint(0,5,(4,4)),columns=list('1234'))
data.iloc[1]=data.iloc[0]
data#输出:1 2 3 4
0 0 3 0 2
1 0 3 0 2
2 3 0 1 1
3 4 0 4 2
接着用duplicated()查找重复值,可以看出第二行与第一行重复:
data.duplicated()#输出:
0 False
1 True
2 False
3 False
dtype: bool
删除重复行:
data = data.drop_duplicates(subset=['1'],keep='first',ignore_index=False)
data#输出:1 2 3 4
0 0 3 0 2
2 3 0 1 1
3 4 0 4 2
2.2.3 任务三:将前面清洗的数据保存为csv格式
data.to_csv('data.csv')
2.3 特征观察与处理
2.3.1 任务一:对年龄进行分箱(离散化)处理
(1) 分箱操作是什么?
分箱操作是将连续型数值序列分为几段。
- 方法一:pd.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)将根据值本身来选择箱子均匀间隔,即每个箱子的间距都是相同的。
- 方法二:pd.qcut()是根据这些值的频率来选择箱子的均匀间隔,即每个箱子中含有的数的数量是相同的。
来源:https://blog.csdn.net/weixin_41907245/article/details/100122289?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link
(2) 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
train1['Age_cut'] = pd.cut(train1['Age'],bins=5,labels=['1','2','3','4','5'])
train1['Age_cut'].value_counts().sort_index().plot(kind='bar')
(3) 将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示
train1['Age_cut1'] = pd.cut(train1['Age'],bins=[0,5,15,30,50,80],right=False,labels=['1','2','3','4','5'])
train1['Age_cut1'].value_counts().sort_index().plot(kind='bar')
(4) 将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示
train1['Age_cut2'] = pd.qcut(train1['Age'],[0.,0.1,0.3,0.5,0.7,0.9],labels=['1','2','3','4','5'])
train1['Age_cut2'].value_counts().sort_index().plot(kind='bar')
(5) 将上面的获得的数据分别进行保存,保存为csv格式
train1.to_csv('train1.csv')
2.3.2 任务二:对文本变量进行转换
(1) 查看文本变量名及种类
文本变量包括Sex, Cabin ,Embarked,我们用一个自定义函数查看各文本变量值及种类:
cat = ['Sex','Cabin','Embarked']def value(df,cat):for i in cat:print(i)value = df[i].value_counts().sort_index()display(value)print('\n')value(train,cat)#输出:
Sex
female 314
male 577
Name: Sex, dtype: int64Cabin
A10 1
A14 1
A16 1
A19 1
A20 1..
F33 3
F38 1
F4 2
G6 4
T 1
Name: Cabin, Length: 147, dtype: int64Embarked
C 168
Q 77
S 644
Name: Embarked, dtype: int64
(2) 将文本变量Sex, Cabin ,Embarked用数值变量12345表示
- 方法一:用pd.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad')
- 方法二:用pd.map()
- 方法三:用LabelEncoder()对不连续的数字或者文本进行编号,处理标签专用。
#方法一
train['Sex_rep'] = train['Sex'].replace(['male','female'],[1,2])
#方法二
train['Sex_num'] = train['Sex'].map({'male': 1, 'female': 2})
#方法三
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Embarked']:lbl = LabelEncoder() label_dict = dict(zip(train[feat].unique(), range(train[feat].nunique())))train[feat + "_labelEncode"] = train[feat].map(label_dict)train[feat + "_labelEncode"] = lbl.fit_transform(train[feat].astype(str))train.head()
输出:
(3) 将文本变量Sex, Cabin, Embarked用one-hot编码表示
Sex = pd.get_dummies(train['Sex'],prefix='Sex')
Cabin = pd.get_dummies(train['Cabin'],prefix='Cabin')
Embarked = pd.get_dummies(train['Embarked'],prefix='Embarked')
train = pd.concat([train.drop(['Sex','Embarked','Cabin'],axis=1),Sex,Cabin,Embarked],axis=1)
train.head()
输出:
2.3.3 任务三:从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)
train['Title'] = train.Name.str.extract('([A-Za-z]+)\.', expand=False)
train.head()
输出:
总结:
通过task2第一节的学习掌握了数据清洗与处理的基本方法:
- 首先,查看数据的缺失值、根据不同特征值的重要性对其中的缺失值进行处理,包括删除含缺失值所有的行、删除带有缺失值的列和对缺失值填充数据三种处理方式;
- 随后,对数据中的重复值进行查看和处理,主要运用了duplicated()与drop_duplicates()进行配套处理;
- 最后,对数据不同的特征值进行观察、分类,区分为文本型、离散型数值、连续型数值,并分别处理,运用分箱操作对连续型数值进行处理,将文本转化为离散型数值,以便于后续模型训练。
动手学数据分析Task2第一节数据清洗及特征处理相关推荐
- 动手学数据分析(二)- 数据清洗及特征处理
1 初心 本系列笔记用于记录自己第一次参加Datawhale的组队学习.自己马上开启研究生学习生涯,因此熟练掌握数据分析这一重要技能对未来的学习能够提供很大的帮助,Datawhale团队在项目初衷里说 ...
- 动手学数据分析 TASK2 数据清洗及特征处理
本篇主要解决数据清洗和数据的特征处理问题,数据清洗包括缺失值.重复值的处理.字符串数据转换等,此项过程为数据分析的前序环节起铺垫作用. 2 第二章:数据清洗及特征处理 知识概要 缺失值和重复值的观察与 ...
- 第二章:第一节数据清洗及特征处理-自测
回顾&引言]前面一章的内容大家可以感觉到我们主要是对基础知识做一个梳理,让大家了解数据分析的一些操作,主要做了数据的各个角度的观察.那么在这里,我们主要是做数据分析的流程性学习,主要是包括了数 ...
- 第二章:第一节数据清洗及特征处理-课程
[回顾&引言]前面一章的内容大家可以感觉到我们主要是对基础知识做一个梳理,让大家了解数据分析的一些操作,主要做了数据的各个角度的观察.那么在这里,我们主要是做数据分析的流程性学习,主要是包括了 ...
- Titanic第二章:第一节数据清洗及特征处理
2.1 缺失值观察与处理 import numpy as np import pandas as pd from matplotlib import pyplot as plt #读取文件train ...
- Datawhale动手学数据分析打卡
1.1 第一章:数据载入及初步观察 1.1.1 任务一:导入numpy和pandas import numpy as np import pandas as pd 1.1.2 任务二:载入数据 (1) ...
- 动手学数据分析——Task01_数据加载
前言 这是一门诞生于datawhale的课程,学习它的时候搭配datawhale所配备其他资源会更好,项目地址:https://github.com/datawhalechina/hands-on-d ...
- 【TL第二期】动手学数据分析-第二章 数据预处理
文章目录 第二章 第一节 数据清洗及特征处理 第二节 数据重构1 第三节 数据重构2 第四节 数据可视化 第二章 第一节 数据清洗及特征处理 数据清洗:对于原始数据中的缺失值.异常值进行处理.相当于数 ...
- 动手学数据分析 | 数据清洗及特征处理(二)
接上篇动手学数据分析 | 数据基础操作(一),下面代码为本篇内容的基本代码准备工作. import numpy as np import pandas as pddf = pd.read_csv('t ...
最新文章
- [Bzoj4408]神秘数(主席树)
- java关键字和保留字整合(不定期补充) 转自小码哥
- Terminal Services将改名为RDS
- Java中的锁的概念大汇总
- 设计模式 之 --- GRASP
- vue 离开页面事件_【必看】58 道 Vue 常见面试题集锦,涵盖入门到精通,自测 Vue 掌握程度...
- 室外AIS天线AV400
- 开关电源和家电电源常用电磁兼容(EMC)执行标准
- 京东商城架构峰值系统设计
- cmake find_package 原理简介以及使用说明
- 网络安全——Cobaltstrike
- iqooneo3 如何不用vivo账号下载外部应用_VIVO市场ASO实战详解
- 加密文档的三种基本方法
- SpringBoot整合elasticsearch (java整合es)
- Xilinx FPGA输入输出缓冲 BUF 的使用
- 相机快门之:电子快门
- mysql 关联更新_MySQL UPDATE多表关联更新
- API调用,淘宝天猫、1688、京东、拼多多商品详情(接口数据聚全)
- 如何学习嵌入式系统(基于ARM平台)
- QTP飞机订票测试实例
热门文章
- 傅氏级数的各项系数_傅里叶系数的推导
- matlab 求矩形脉冲的傅里叶系数
- cfm在哪些应用服务器可执行,CFM 文件扩展名: 它是什么以及如何打开它?
- 关于微信跳转H5页面,背景色显示灰色问题
- 苹果笔记本怎么安装python_苹果系统MAC下如何安装Python解释器
- 计算机显示用户文件夹,移动Win7用户文件夹(我的文档)默认位置至D盘
- 国外开发者:VR游戏开发的酸甜苦辣
- aws 数据库迁移_将您的sql数据库迁移到云AWS和Azure
- 瑞萨RA系列 bootloader使用MCUBoot模块更新升级应用的实例
- mPython编程掌控板连接tinywebdb数据库