知识梳理不易,请尊重劳动成果,文章仅发布在CSDN网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息
Pandas 是基于 NumPy 的一种工具,该工具是为了解决数据分析任务而创建的;
Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具;
Pandas 提供了大量能使我们快速且便捷处理数据的函数和方法;
Pandas 在2010年成为开源项目,是一个在真实世界中广泛应用的大型类库;Pandas的开发者社区有超过800个代码贡献者,他们帮助构建了项目,并将Pandas应用到日常中去解决他们的数学难题;
DataFrame是pandas中最常用的数据类型,Frame在英语单词中表示框体的含义,前面配合着Data组合就可以理解为数据的框体
关键代码:pd.DataFrame()
import pandas as pd
weather_data = {
'day' : ['2018/1/1','2018/1/2','2018/1/3','2018/1/4','2018/1/5'],
'temperature' : [31,32,26,30,29],
'windspeed' : [6,3,5,4,5],
'event': ['Sunny','Sunny','Rain','Sunny','Rain']
}
df = pd.DataFrame(weather_data)
df
输出结果为:(根据字典创建DataFrame,输出结果中的字段名称为字典的键,字段里面的内容就是字典中的值,且值都放置在列表中。仔细一点的同学可以发现列表里面包含了数值,时间和字符串,DataFrame可以简单理解为python版的‘Excel’,这样更容易弄懂)
关键代码:pd.read_csv()/pd.read_excel()
df2 = pd.read_csv('data/nyc_weather.csv')
df2.head()
输出结果为:(head()
方法默认显示前5行数据,注意默认的index,就是第一列的数据是从0开始)
有了显示前5行的操作就有显示后5行的需求,tail()
函数就能够满足。这里还是要提醒一下,最后一行的第一个数据显示30,一定要结合第一行的第一个数据来看,不能简单地觉得这里显示30就是数据有30行,index是从0开始的,这里总共有31行
为了避免单纯的以第一个数据来判断数据量造成的错误,我们可以直接使用shape()
的方法查看数据的形状,输出的结果中就会返回数据的行数和列数(如果是只要查看数据量,直接可以借用之前学到的len()
函数即可)
(1)按照行进行数据获取
尝试直接进行第1行的索引(对应的index值为0),结果发现报错
正确的使用方式应该是以切片的方式进行,比如取第3,4行(注意列表的切片是含头不含尾,且数值是从0开始),head()
方法取数据必须是要从第1行进行取,没有办法自由指定起始位置
既然可以用切片了,那么再配合着步进就能实现指定位数据的提取,比如每隔一行提取一条数据
(2)按照列进行数据获取
有两种方式,第一种是通过DataFrame.字段名
,还有一种是DataFrame['字段名']
这里需要特别提到,第一种方式只能选取一列,而且还容易出问题,比如字段名称里面包含空格时候就不能使用,因此比较推荐是第二种使用方式,使用双层列表还可以进行多列查询。
对比一列查询和多列查询返回的数据类型,选取一列默认输出的就是Series数据类型(显示有key 和 value组成的数据,和字典有区别),多列系统自动转换成为了DataFrame
额外的补充一下,如果选取一列也想转化为DataFrame,可以有两种方式。第一种就是直接按照多列数据双层列表的选取方式,第二种就是使用to_frame()
方法
(1)求解列数据的统计量
比如获取通过csv读取的数据df2
中Temperature
字段的最大值(max
)、最小值(min
)、均值(mean
)、标准差(std
)、众数(mode
)、方差(var
),中位数(median
)等
此外还有一个汇总的方法,也挺好用,就是describe()
方法,直接获取某字段的统计信息,包含了最大、最小值、均值、中位数和数据量等信息
(2)条件筛选
就有点类似Excel中的筛选器,比如查询df
数据中风速大于5的数据,对应着有全部字段的筛选(23的输出),也有目标字段的筛选(24的输出)
有时候需要进行多重条件的筛选,就可以直接在列表里面加上筛选的条件,比如选择风速小于6的并且温度小于31的数据(注意筛选的条件用括号括起来,中间的符号为逻辑连接符,&
表示and
,|
表示or
)
(1)索引index操作
通过以上的输出结果,可以发现第一列都是由01234…数字构成的,这里列就是索引index
,可以直接通过DataFrame.index
获取
其实很多时候,我们并不是想要获取index
数据,而是想重新指定index
的内容,比如再分析的时候最常见的就是按照时间进行分析,这时候就需要使用日期的字段作为index
,实现方法就是set_index('字段名')
通过上面的操作,很迷惑,为啥已经设置了index
,但是最后的df
返回的结果还是没有改变呢?这里就涉及到改变原有数据结构的问题,主要有两种方式,第一种重新赋值,将改变后的结果赋值到新的变量;第二种使用inplace=True
参数
以上两种方法倾向于使用第一种方式,为了不破坏原有的数据结构,建议重新赋值,这样原来的变量对应的数据就不会发生改变,一旦使用第二种操作,df
的数据就发生了变化,正如inplace这个单词的含义,表示原地生效,这种操作是不可逆,务必保存好前一步的数据结果
如果还是想把索引换成数值的形式,有时候的确是有这个需求,可以使用reset_index()
方法(这样关于如何指定某一列作为index
,以及如何重置index
就介绍完毕)
(2)索引取值
之前介绍了直接通过列表的索引取值,这里再补充介绍一下loc[]
取数据的方式(loc
就是location
的缩写,根据位置进行索引取值)。之前直接使用df2[0]
索引取第一行程序报错,如果替代使用df2.loc[0]
看看输出结果。单行和单列的输出数据类型都是为Series,对于多行数据的取值也和之前介绍的多列数据的取值很神似
上面的示例还没有看出loc
和之前索引取值的差别,接下来以df
数据为例,使用风速作为索引。通过结果输出可以发现通过loc索引选取的数据:是以index为所输入数据值位置所在的行数据,而之前的索引是按照序号进行选取数据
此外还有一种取值的方式是iloc
,这种方式也挺好用,不需要知道字段名称,可以进行数据的获取,在之后的机器学中会经常遇到,比如标签列往往处理完之后就在最后一列,那么除最后一列之外的数据就全部都是测试数据
关于几种数据提取方式的小结:
df.loc['字段名']
、df[x:y:z]
(x,y,z均为整数)df['xxx']
、df.xxx
(这里的xxx都是字段名)df.iloc[x:y, w:h]
(任意截取数据,x,y,w,h都是整数)对Csv或者Excel文件读取中一些细节问题进行介绍,主要是因为文件数据中存在着编码,格式还有一些不规则的数据等相关问题
首先介绍一下函数使用说明文档的调用,在进行编程敲代码的过程中,使用说明文档是第一参考指南,如果每次使用都得去官方网址打开一下官方的说明文档,会很麻烦,在Jupyter notebook中可以使用快捷键:shift + tab
(其中tab最多可以按四次),比如再读取Csv文件过程中,打开使用说明文档
使用文档会调用后,可以发现读取Csv文件中有很多的参数,这些参数就是针对数据读取过程中的各种复杂问题的数据,接下来就是进行部分参数的使用,其余的一些参数再之后的实操中也会陆续的使用
有时候会遇到Csv/Excel文件中全部都是数据,没有字段头,为了模拟这种情况,将weather_data.csv文件中的字段头删除,另存为weather_data3.csv文件,这时候再读取发现系统会自动把第一行数据作为字段名称,这种输出并不是想要的结果
可以通过header=None
参数的设置来解决这个问题,设置后再读取,程序默认以阿拉伯数字01234…给字段命名
核心代码:df.columns = list1
(将list1变量对应的信息作为数据的字段名称),首先可以通过df.columns获取读取数据的所有字段名称,然后这个变量可以再重新接受赋值,用于修改字段的名称,比如按照另外一个DataFrame数据类型的字段名称给要处理的这个DataFrame进行命名
既然是可以重新赋值命名字段名称,那么只要是传递的列表中元素的个数和数据的列数一致,从而达到对数据的字段进行重命名
报表中经常会出现这种合并的标题占据多行或者多列,有些甚至为了美观并不是直接在第一行就进行排版,因此就会遇到此类的问题。首先看一下空行的数据,将原来的weather_data.csv文件最开始添加空白的三行数据后保存,再进行数据读取,输出的结果发现系统会自动帮助过滤掉空行
然后在此文件的前三行进行合并单元格,并输入文字内容,如下
再次执行上面的程序进行数据读取操作,可遇到一个之后可以经常看见的编码问题报错,EncodeError
这类报错就是文件中的数据直接使用默认参数是没有办法直接进行解析,所以抛出编码错误
解决的思路分两步走,首先通过指定函数里面的参数encoding参数,对于中文可以首先使用gbk编码,如果gbk不行可以换成utf-8的编码。输出结果发现直接通过gbk编码就解决了这个问题
第二种方式就是手动指定文件的编码,文件使用记事本的方式打开,里面的数据不做改动,直接文件另存为,然后在点击确认按钮旁边修改保存的编码类型,如下
这时候再进行文件的读取,不需要指定encoding参数,默认读取就可以
如果指定的该参数与文件的编码参数不一致就可能再次发生编码错误导致乱码,所以先默认读取,输出报错的话再指定具体的编码参数
把编码修改为utf-8后再读取看看结果,这样就完美的解决了编码的问题
接下来就是处理合并行数据,可以发现读取进来的结果是按照逗号的分割的规格进行可以获得第一个数据,其他的单元格默认时候空值填充了,因此对于此类问题可以通过skiprows=num
方式进行处理(num
代表要跳过的行数)
有时候读取文件中内容是中间变量数据,没有索引和字段的名称,这时候就需要手动指定,核心代码为:pd.DataFrame(data,index=list1,columns=list2)
最开始介绍了常见的两种创建DataFrame的方式, 此外还有很多的创建方法,这里就不在进行赘述了,方法太多了,单独梳理一篇博客:Pandas数据结构Dataframe:基本概念及创建,有兴趣可以点击链接进行阅读