学习笔记之第5章 数据预处理(五)

本章节介绍了数据预处理的重要步骤,包括缺失值的查看、删除和填充,如使用fillna()方法填充0或指定值,dropna()方法删除缺失值。此外,还讲解了如何处理重复数据,如使用drop_duplicates()方法删除重复行,并通过keep参数选择保留第一个或最后一个。最后,提到了异常值的检测与处理,如通过业务理解、箱形图和3σ原则识别异常值,并讨论了删除和填充等处理方式。
摘要由CSDN通过智能技术生成

第5章 数据预处理

  • 常见的不规整数据主要有缺失数据、重复数据、异常数据几种,在开始正式的数据分析之前,我们需要先把这些不太规整的数据处理掉。

5.1 缺失值处理

  • 缺失值就是由某些原因导致部分数据为空,对于为空的这部分数据我们一般有两种处理方式,一种是删除,即把含有缺失值的数据删除;另一种是填充,即把缺失的那部分数据用某个值代替。

5.1.1 缺失值查看

df = pd.read_excel(r"D:\PythonFlie\test.xlsx")
df.info()
  • 输出结果
    在这里插入图片描述

  • isnull()方法来判断哪个值是缺失值,如果是缺失值则返回True,如果不是缺失值则返回False。

df.isnull()
  • 输出结果
	编号	年龄	性别	注册时间
0	False	False	False	False
1	False	False	False	False
2	False	False	True	False
3	False	False	False	False
4	False	False	False	False
5	False	False	False	False
6	False	False	False	False
7	False	False	False	False

5.1.2 缺失值删除

  • 缺失值分为两种,一种是一行中某个字段是缺失值;另一种是一行中的字段全部为缺失值,即为一个空白行。
  • dropna()方法,dropna()方法默认删除含有缺失值的行,也就是只要某一行有缺失值就把这一行删除。
df = pd.read_excel(r"D:\PythonFlie\test.xlsx")
df
  • 输出结果
编号	年龄	性别	注册时间
0	A1	54.02018-10-01
1	A2	16.02018-10-02
2	A3	47.0	NaN	2018-10-03
3	A4	41.02018-10-04
4	A1	54.02018-10-01
5	NaN	NaN	NaN	NaT
6	A2	16.02018-10-02
7	A3	47.02018-10-03
8	A4	41.02018-10-04
df.dropna()
  • 输出结果
编号	年龄	性别	注册时间
0	A1	54.02018-10-01
1	A2	16.02018-10-02
3	A4	41.02018-10-04
4	A1	54.02018-10-01
6	A2	16.02018-10-02
7	A3	47.02018-10-03
8	A4	41.02018-10-04
  • 运行dropna()方法以后,删除含有NaN值的行,返回删除后的数据。
  • 如果想删除空白行,只要给dropna()方法传入一个参数how = "all"即可,这样就会只删除那些全为空值的行,不全为空值的行就不会被删除。
df.dropna(how = "all")
  • 输出结果
	编号	年龄	性别	注册时间
0	A1	54.02018-10-01
1	A2	16.02018-10-02
2	A3	47.0	NaN	2018-10-03
3	A4	41.02018-10-04
4	A1	54.02018-10-01
6	A2	16.02018-10-02
7	A3	47.02018-10-03
8	A4	41.02018-10-04

5.1.3 缺失值填充

  • 上面介绍了缺失值的删除,但是数据是宝贵的,一般情况下只要数据缺失比例不是过高(不大于30%),尽量别删除,而是选择填充。
  • 除了用0填充、平均值填充、众数(大多数)填充,还有向前填充(即用缺失值的前一个非缺失值填充)
  • 在Python中,我们利用的fillna()方法对数据表中的所有缺失值进行填充,在fillna后面的括号中输入要填充的值即可。
df.fillna(0)
  • 输出结果
编号	年龄	性别	注册时间
0	A1	54.02018-10-01 00:00:00
1	A2	16.02018-10-02 00:00:00
2	A3	47.0	0	2018-10-03 00:00:00
3	A4	41.02018-10-04 00:00:00
4	A1	54.02018-10-01 00:00:00
5	0	0.0	0	0
6	A2	16.02018-10-02 00:00:00
7	A3	47.02018-10-03 00:00:00
8	A4	41.02018-10-04 00:00:00
  • 在 Python 中我们也可以按不同列填充,只要在 fillna()方法的括号中指明列名即可。
df.fillna({"性别":"男"})
  • 输出结果
编号	年龄	性别	注册时间
0	A1	54.02018-10-01
1	A2	16.02018-10-02
2	A3	47.02018-10-03
3	A4	41.02018-10-04
4	A1	54.02018-10-01
5	NaN	NaN	男	NaT
6	A2	16.02018-10-02
7	A3	47.02018-10-03
8	A4	41.02018-10-04
  • 同时对多列填充不同的值
df.fillna({"性别":"男","年龄":"30"})
  • 输出结果
编号	年龄	性别	注册时间
0	A1	54.02018-10-01
1	A2	16.02018-10-02
2	A3	47.02018-10-03
3	A4	41.02018-10-04
4	A1	54.02018-10-01
5	NaN	30	男	NaT
6	A2	16.02018-10-02
7	A3	47.02018-10-03
8	A4	41.02018-10-04

5.2 重复值处理

  • 重复数据就是同样的记录有多条,对于这样的数据我们一般做删除处理
  • 在Python中我们利用drop_duplicates()方法,该方法默认对所有值进行重复值判断,且默认保留第一个(行)值
df.drop_duplicates()
  • 输出结果
	编号	年龄	性别	注册时间
0	A1	54.02018-10-01
1	A2	16.02018-10-02
2	A3	47.0	NaN	2018-10-03
3	A4	41.02018-10-04
5	NaN	NaN	NaN	NaT
7	A3	47.02018-10-03
  • 上面的代码是针对所有字段进行的重复值判断,我们同样也可以只针对某一列或某几列进行重复值删除的判断,只需要在drop_duplicates()方法中指明要判断的列名即可。
df.drop_duplicates(subset="编号")
  • 输出结果
	编号	年龄	性别	注册时间
0	A1	54.02018-10-01
1	A2	16.02018-10-02
2	A3	47.0	NaN	2018-10-03
3	A4	41.02018-10-04
5	NaN	NaN	NaN	NaT
  • 也可以利用多列去重,只需要把多个列名以列表的形式传给参数subset即可
df.drop_duplicates(subset=["编号","性别"])
  • 输出结果
编号	年龄	性别	注册时间
0	A1	54.02018-10-01
1	A2	16.02018-10-02
2	A3	47.0	NaN	2018-10-03
3	A4	41.02018-10-04
5	NaN	NaN	NaN	NaT
7	A3	47.02018-10-03
  • 还可以自定义删除重复项时保留哪个,默认保留第一个,也可以设置保留最后一个,或者全部不保留。
  • 通过传入参数keep进行设置,参数keep默认值是first,即保留第一个值;也可以是last,保留最后一个值;还可以是False,即把重复值全部删除。
df.drop_duplicates(subset=["编号","性别"],keep = "last")
  • 输出结果
编号	年龄	性别	注册时间
2	A3	47.0	NaN	2018-10-03
4	A1	54.02018-10-01
5	NaN	NaN	NaN	NaT
6	A2	16.02018-10-02
7	A3	47.02018-10-03
8	A4	41.02018-10-04
df.drop_duplicates(subset=["编号","性别"],keep = False)
  • 输出结果
编号	年龄	性别	注册时间
2	A3	47.0	NaN	2018-10-03
5	NaN	NaN	NaN	NaT
7	A3	47.02018-10-03

5.3 异常值的检测与处理

  • 异常值就是相比正常数据而言过高或过低的数据

5.3.1 异常值检测

  • 要处理异常值首先要检测,也就是发现异常值,发现异常值的方式主要有以下三种。
    • 根据业务经验划定不同指标的正常范围,超过该范围的值算作异常值。
    • 通过绘制箱形图,把大于(小于)箱形图上边缘(下边缘)的点称为异常值。
    • 如果数据服从正态分布,则可以利用3σ 原则;如果一个数值与平均值之间的偏差超过3倍标准差,那么我们就认为这个值是异常值。

5.3.2 异常值处理

  • 对于异常值一般有以下几种处理方式。
    • 最常用的处理方式就是删除。
    • 把异常值当作缺失值来填充。
    • 把异常值当作特殊情况,研究异常值出现的原因。
  • 在Python中,删除异常值用到的方法和Excel中的方法原理类似,Python中是通过过滤的方法对异常值进行删除。比如 df 表中有年龄这个指标,要把年龄大于200的值删掉,你可以通过筛选把年龄不大于200的筛出来,筛出来的部分就是删除大于200的值以后的新表。
  • 对异常值进行填充,就是对异常值进行替换,利用replace()方法可以对特定的值进行替换。
  • 关于数据筛选和数据替换会在接下来的章节介绍。

5.4 数据类型转换

5.4.1 数据类型

  • Pandas不像Excel分得那么详细,它主要有6种数据类型,如下表所示
类型说明
int整型数,即整数
float浮点数,即含有小数点的数
objectpython对象类型,用o表示
string字符串类型,经常用S表示,S10表示长度为10的字符串
unicode固定长度的unicode类型,跟字符串定义方式一样
datetime64[ns]表示时间格式
  • 在 Python 中,不仅可以用 info()方法获取每一列的数据类型,还可以通过 dtype方法来获取某一列的数据类型。

5.4.2 类型转换

  • 在Python中,我们利用astype()方法对数据类型进行转换,astype后面的括号里指明要转换的目标类型即可。
df["年龄"].astype("int64")
  • 输出结果
0    54
1    16
2    47
3    41
4    54
5    16
6    47
7    41
Name: 年龄, dtype: int64

5.5 索引设置

  • 索引是查找数据的依据,设置索引的目的是便于我们查找数据。

5.5.1 为无索引表添加索引

  • 在Python中,如果表没有索引,会默认用从0开始的自然数做索引
import pandas as pd
df = pd.read_excel(r"D:\PythonFlie\test_1.xlsx",header=None)
df
  • 输出结果
0	1	2	3
0	A1	张旭	101	2018-10-01
1	A2	李刚	102	2018-10-02
2	A3	孙峰	103	2018-10-03
3	A4	赵恒	104	2018-10-04
4	A5	赵恒	104	2018-08-12
  • 通过给表df的columns参数传入列索引值,index参数传入行索引值达到为无索引表添加索引的目的
df.columns = ["订单编号","客户姓名","唯一识别码","交易日期"]
df
  • 输出结果
订单编号	客户姓名	唯一识别码	交易日期
0	A1	张旭	101	2018-10-01
1	A2	李刚	102	2018-10-02
2	A3	孙峰	103	2018-10-03
3	A4	赵恒	104	2018-10-04
4	A5	赵恒	104	2018-08-12
df.index = [1,2,3,4,5]
df
  • 输出结果

订单编号	客户姓名	唯一识别码	交易日期
1	A1	张旭	101	2018-10-01
2	A2	李刚	102	2018-10-02
3	A3	孙峰	103	2018-10-03
4	A4	赵恒	104	2018-10-04
5	A5	赵恒	104	2018-08-12

5.5.2 重新设置索引

  • 在Python中可以利用set_index()方法重新设置索引列,在set_index()里指明要用作行索引的列的名称即可。
df.set_index("订单编号")
  • 输出结果
	客户姓名	唯一识别码	交易日期
订单编号			
A1	张旭	101	2018-10-01
A2	李刚	102	2018-10-02
A3	孙峰	103	2018-10-03
A4	赵恒	104	2018-10-04
A5	赵恒	104	2018-08-12
  • 在重新设置索引时,还可以给 set_index()方法传入两个或多个列名,我们把这种一个表中用多列来做索引的方式称为层次化索引,层次化索引一般用在某一列中含有多个重复值的情况下。

5.5.3 重命名索引

  • 在Python中重命名索引,我们利用的是rename()方法,在rename后的括号里指明要修改的行索引及列索引名。
df.rename(columns = {"订单编号":"新订单编号","客户姓名":"新客户姓名"})
  • 输出结果
	新订单编号	新客户姓名	唯一识别码	交易日期
1	A1	张旭	101	2018-10-01
2	A2	李刚	102	2018-10-02
3	A3	孙峰	103	2018-10-03
4	A4	赵恒	104	2018-10-04
5	A5	赵恒	104	2018-08-12
df.rename(columns = {"订单编号":"新订单编号","客户姓名":"新客户姓名"},
    index = {1:"一",2:"二",3:"三",4:"四",5:"五"})
  • 输出结果
	新订单编号	新客户姓名	唯一识别码	交易日期
一	A1	张旭	101	2018-10-01
二	A2	李刚	102	2018-10-02
三	A3	孙峰	103	2018-10-03
四	A4	赵恒	104	2018-10-04
五	A5	赵恒	104	2018-08-12

5.5.4 重置索引

  • 重置索引主要用在层次化索引表中,重置索引是将索引列当作一个columns进行返回。
  • 在Python利用的是reset_index()方法
df.reset_index(leve = None,drop = False,inplace = False)
  • level参数用来指定要将层次化索引的第几级别转化为columns,第一个索引为0级,第二个索引为1级,默认为全部索引,即默认把索引全部转化为columns。
  • drop参数用来指定是否将原索引删掉,即不作为一个新的columns,默认为False,即不删除原索引。
  • inplace参数用来指定是否修改原数据表。
  • reset_index()方法常用于数据分组、数据透视表中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值