:Pandas功能介绍及应用
Posted 百木从森
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了:Pandas功能介绍及应用相关的知识,希望对你有一定的参考价值。
第三章:Pandas功能介绍及应用
- 1.2.1 Excel数据默认读取
- 1.2.2 指定sheet进行读取
- 1.2.3 读入数据初步处理
- 1.2.4 数据保存为Excel文件
- 1.2.5 保存数据到同一文件下的不同sheet中
- 3 数据替换
作者:Be_melting
1 Csv和Excel文件读取与写入
1.1 Csv文件读取与写入
1.1.1 Csv数据读取
这里以一份股票数据为例,利用Pandas进行数据读取,操作输出如下,直接将文件所在路径复制到括号中,直接进行读取会发生报错
原因与解决问题的方法如下:
- 文件路径中不能只使用
\\
,因为\\
在python字符串中表示转义字符(有时候不留意就会报错) - 解决方式有三种(绝对路径):
/、\\\\、r
- 最简单粗暴的方式:相对路径
(1)使用绝对路径(把文件的全部路径信息输入完整)读取Csv文件如下
(2)使用相对路径读取Csv文件:最简单的操作就是把要读取的数据文件和python文件放在同一文件夹下,直接读取就不会报错
不过以上是在处理单个文件时候的操作,此外为了养成一个良好的习惯,之后如果遇到处理多份数据和分析过程有多个阶段时候,往往会把各个过程分析的python文件单独放在一个文件,数据再放在另一个单独的文件夹中,方便后续工作的管理(特别是在论文写完之后进行数据文件的校对,所有的数据都在一个文件夹中就方便查找),比如这里就是将所有的pyhton代码文件放在adv文件夹中,数据放在data文件夹中,这两个文件夹都是在src文件夹下
这时候读取数据的方式就是相对路径和绝对路径结合(前面的..
代表着此文件所在的上一层文件夹)
1.1.2 跳过指定行读取数据
前面在介绍Pandas基础的时候有介绍skiprows
参数,这里补充讲一下,该参数的值可以直接是整型数据,也可以是列表数据
需要注意的就是如果是列表,切记取值是从0开始取的,如上所示skiprows=[0]
等同于skiprows=1
都表示跳过第一行再读取数据。直接赋值整型数据n,代表跳过前n行;如果赋值是列表,可以指定跳过一些中间不想要的数据,这样就能过滤掉一些不想要的行。比如下面指定的skiprows=[1,3,4]
,相当于跳过第2、4、5行数据再读取(注意:此处字段名所在的行为第1行)
1.1.3 字段名称操作
之前讲解过headers=None
参数的设置,直接将字段名称忽略,自动分配从0开始表达列数量的数字,如下
除此之外,这个还可以配合着names
参数搭配使用,再处理没有字段名称的数据时候,直接指定,再回顾一下之前的内容,两者就构成了字段名称处理的两种方式
1.1.4 读取指定数量的数据
有时数据量太大,不需要提取全部的数据,只要进行里面的部分数据的提取就可以,那么就需要直接读取指定要求的行数,比如刚刚的数据由于只有5条,这里指定读取3条
同时也可以配合着之前介绍的skiprows参数使用,如下
上面的方式只能获取固定规则下的数据,如果说是要随机采样,获取指定长度的数据,可以使用sample(n)
方式,其中n就代表采样数量
1.1.5 数据存入Csv
数据处理完毕后,想要保存到本地,可以使用to_csv()
的方法
- (1)直接填写路径不加任何参数,会把整个DataFrame完整不动地保存在本地
- (2)
index=False
参数,取消第一列的索引值,如果索引是01234…是默认数值,这个可以设置,如果是其他有含义的索引列,一般不会进行取消,这里要根据实际需求设置 - (3)
header=False
参数,或许不想生成的数据里面有字段名称,就可以使用这个参数设定 - (4)
columns=[xxx]
参数,代表只保存列表中含有的数据字段,相当于进行数据指定列保存
1.2 Excel数据读取与写入
1.2.1 Excel数据默认读取
还是使用刚刚的股票数据,文件是通过csv文件另存为Excel文件,括号中添加数据所在的地址,读取操作如下
1.2.2 指定sheet进行读取
Excel中会存在多个表单(sheet),每个表单中都会有数据,有时数据并不是在默认的第一个表单中,因此就有需要根据不同的表单获取数据,比如将原表单的数据复制一份到第二份表单中,为了区别开来,将字段名称后都添加个2
关键参数为sheet_name
,该参数为函数中第二个位置的参数且赋值可以为整数也可以为字符串,所以在文件路径后面直接输入对应的表名通过位置参数传递或者直接通过参数名称赋值传递表名都可以,如下(sheet_name
默认值为0,即读取第一个sheet中的内容,第二个sheet表单就对应着sheet_name=1
)
1.2.3 读入数据初步处理
有时候拿到的数据里面存在缺失值或者异常值,在读取数据过程就就可以直接进行处理,读入后就是清洗过的完整数据。需要使用到converters
参数,赋值对应是一个字典,里面的键为字段名称,值就为处理该字段的方法/函数,比如price字段中存在着n.a.数据(缺失值),可以直接进行替换
比如处理异常值,收入在一定的范围内是正常,超过就是300设定为高收入(这里不知道具体的单位,只做假设演示),然后负数自然是异常数据。通过converters
参数就可以实现数据的初步清洗
1.2.4 数据保存为Excel文件
数据处理完毕后保存为原来的文件格式,这里的操作和之前保存Csv文件类似。由于Excel中是存在行和列,可以更加具体指定数据保存位置开始的范围,比如要保存从第3行和第四列开始
最后out3.xlsx文件的内容如下(startrow
和startcol
两个参数相当于指定数据存放在Excel中平移的位置)
1.2.5 保存数据到同一文件下的不同sheet中
前面介绍了读取不同sheet中的数据,自然有时也会有讲数据保存到不同sheet的需求,具体的模板代码如下
with pd.ExcelWriter(../data/combine.xlsx) as writer:
df3.to_excel(writer,sheet_name=df1)
df3.to_excel(writer,sheet_name=df2,startrow=3,startcol=4)
其中第一行中的文件路径就是要保存的文件名称,然后下面两个代码是指定sheet的名称,关于这部分还是挺实用,有兴趣可以参考一下博客中的另外两篇文章:筛选同一表格下的多个sheet里的内容并保存在对应的sheet中 和 【python办公自动化】将Word文本和Pdf表格数据提取并整合到同一个Exeel下的多sheet中
2 缺失数据处理
缺失值处理的三种方式:
- 直接删除:
dropna()
- 拟合差值:
interpolate()
- 填充:
fillna()
2.1 数据类型查看
在实战中介绍这三种方式知识以及如何使用,首先加载数据,这里使用创建的天气数据
可以发现读取的数据中包含了时间,但是读入进来后Pandas默认将其当做了object数据(也就是字符串数据类型),因此可以在读入的时候使用parse_dates
参数,指定要当做日期处理的字段名,数据读取完毕后,目标字段就会被自动解析为时间的数据类型此外除了直接调用某一字段会显示出该字段的数据类型,使用df.info()
方法就会把所有字段的数据类型都显示出来
2.2 数据缺失值查看与汇总计数
为了获取缺失值,将刚刚的数据中添加一些数据,人为制造缺失值,再进行读取操作
首先通过isna()
方法可以用来查看每个字段中的数据是否为空值,最后使用sum()
方法进行汇总
2.3 缺失数据填充
2.3.1 固定值填充
直接使用fillna()
方法进行,这里和之前读取数据里面converters
参数使用原理类似,都是中间给定一个字典,键为字段名称,值就为要填充的数据
2.3.2 动态值填充
刚刚实现的是按照固定的数值进行缺失值填充,此类数据主要是一些统计结果类型数据,每份数据直接没有很强的关联性,如果手上的数据是一些趋势有规律的数据,比如股票,传感器等类型的数据,再以固定值填充就不靠谱了,因此就有了动态填充的需求
(1)向前填充:ffill
按照当前字段中前一个值,对该缺失值值进行填充
(2)向后填充:bfill
注意点:动态填充存在瑕疵,当数据的第一行或者第最后一行存在缺失值时(前面几行连续缺失或者最后几行连续缺失),动态填充是处理不了的,所以要结合之前的固定值填充的方法,把这个问题解决掉,两者配合着使用就能完成缺失值填充的操作补充点: 如果想要以横向的数据为标准进行填充,有两种方式,第一种可以使用axis = 1
或者axis = ‘columns’
参数;第二种方式就是将df
进行转置new_df = df.T
,这样之前的操作就都可以使用,最后填充完再转置回来就ok啦
此外,还有一个limit
参数,控制填充的个数,如下
2.4 缺失数据拟合差值
2.4.1 直接数值类型数据拟合差值
interpolate()
方法默认就是根据数值计算来进行缺失值的处理,操作如下。输出结果汇总可以看出,既然是依靠数值计算,那么字符串数据类型的缺失值就没有办法处理,对于数值型数据,比如下面红框中的内容,就是根据缺失值前后的数据然后再计算中间缺数据的个数,最后进行等比处理
2.4.2 参照时间类型数据拟合差值
通过method=time
进行操作,注意索引需要是为时间数据类型,这也是前面要转化时间类型数据的原因,首先将索引设置为day
,接着再进行拟合插值,操作结果如下:
- 如果直接指定
newdf = df.interpolate(method=time)
,执行会报错,提醒这种方法要求索引为时间索引 - 第二部分红框的内容和之前的直接拟合差值没有任何区别,主要是因为这部分日期时间是连续的,没有出现隔天的现象
- 第三部分红框的内容就显示出来差别了,这里填充的29,之前填充的是30,就是因为第一种是直接以前后的数值为依据,而这里还参考了前面的时间索引
2.5 缺失数据删除
2.5.1 含缺失值就删除
首先将数据再转化为原来的样子,重置一下索引,如果直接使用dropna()
方法,会直接将只要含有空值的行全部删除,输出结果如下,最后就只剩下3条有效数据
2.5.2 一行数据全为空才删除
其实想删除的是全部数据都为空的行,并不是要求含有缺失值就删除,那么就可以使用how=all
这个参数,输出结果如下
输出中发现有一条数据这里后面三个都是空值,前面有一个字段是时间字段部位空,说明这里的all
要求的是所有字段,如果是这个时间放在索引上面,输出结果如下。结果发现2017-01-19号这条数据就被清除了,再次证明这里的all
是针对所有的字段,也就是从第二列开始的所有数据(第一列为索引)
2.5.3 指定缺失值数量进行条件删除
前面的两种条件都太苛刻了,有时候希望可以控制一下缺失值,满足缺失值数量在某某水平,那么每行超过这个指定缺失值数量的行才被删除,此时thresh
参数就可以发挥重要作用。我们可以自己指定该参数赋值的整数,满足这个条件的行数才会被删除,比如这里指定thresh=1
,就是指所有字段中必须要有一个字段中有数据,容许每行存在的缺失值数量就为:字段数量 - thresh
假如要求每行的缺失值数量不要超过n个,处理的代码为:newdf = df.dropna(thresh=len(df.columns)-n)
3 数据替换
核心方法replace()
3.1 单值替换
顾名思义就是对具体的某一个值进行替换,使用的数据还是刚刚的数据,不过将上面的缺失值都进行修改,变成“异常值”了,读取数据如下
比如将df
中数值为-99999替换成为指定的数据(括号中前面是待替换的数据,后面是替换后的数据)
上面这种是针对具体某一个值的替换,那么更具体一点要求进行某一具体单元格数据的替换,比如将df
中第5行第3列的-99999替换为-88888,具体实现方式就是之前学到的iloc
坐标取值的方式
3.2 多值替换
在单值替换的基础上更进一步,就是进行多值替换,也就是把多个数据同时转化为指定的数据,需要同时使用到to_replace
参数和value
参数。把所有要替换的数据都放在列表中然后复制给to_replace
参数,注意这里event
字段是字符串数据类型,里面的0自然也是字符串的形式(特别是数值替换时,要留心该字段的数据类型)
替换后的值除了是单一的数据外也可以是列表数据,需要和前面的列表数据量保持一致,这样就默认前后一一替换对应了
3.3 列数据替换
操作方式和之前缺失值多列处理以及数据读入预处理的原理基本类似,也是通过字典参数,键对应字段名称,值对应要替换的数据,最后面的一个参数为替换后的数据,输出结果如下,发现只有temperature
字段的-99999数值被替换成了目标数据,windspeed
字段没有发生变化,然后event
字段再次说明了替换是需要注意数据类型
3.4 使用map方法进行替换
3.4.1 传递字典
第一种方式是使用字典的方式进行传递, 需要注意的是map方法使用针对的是具体的某字段数据的替换,且字典中的键应该包含该字段所有的唯一值,否则替换后就会变成空值,操作如下
输出的结果并不是想要的,就是因为指向替换里面的Rain
和Sunny
,但是Snow
和0
没有指定,所以就用空值进行填充,使用map
传递字典需要把所以的唯一值都传入
可能也发现了,使用这种方法只能用在字段中的唯一值较少的情况,如果该字段下面的分类数量过多,那么就要一个一个输入,这个也是此方法的弊端
3.4.2 传递函数
传递函数的方式相较于字典会有更
以上是关于:Pandas功能介绍及应用的主要内容,如果未能解决你的问题,请参考以下文章
Pandas统计分析基础:DataFrame功能介绍及DataFrame中元素的增删改查
Pandas的介绍及 Series DataFrame的创建
Python 之 Pandas 生成时间戳范围Pandas 的时期函数 Period() 和时间序列 - 重采样 resample