Python与数据(一)——数据分析Pandas


Python数据分析系列以《对比Excel,轻松学习Python数据分析》为参考进行学习

什么是Pandas

Pandas是基于Numpy的一种工具,主要用于处理数据进行分析,它纳入了大量的库和一些标准的数据模型,提供了操作大型数据集所需的工具

数据结构

根据百度百科,Pandas里的数据结构有以下几种

  1. Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。Series如今能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。
  2. Time- Series:以时间为索引的Series。
  3. DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。
  4. Panel :三维的数组,可以理解为DataFrame的容器。
  5. Panel4D:是像Panel一样的4维数据容器。
  6. PanelND:拥有factory集合,可以创建像Panel4D一样N维命名容器的模块。

Series

由一组数据及一组与之相关的数据标签(索引)组成,在excel中,如下所示
在这里插入图片描述
前面一列就是数据标签,后面一列是数据,而在Pandas里,创建一个Series的方法是pandas.Series(),如果只传入数据,那么Series使用默认的0、1、2…作为数据标签,如果需要指定数据标签,则通过设置index参数来自定义索引,也可以用字典的方式传入,如下所示:
在这里插入图片描述
如果想获取一组数据的索引,那直接index即可,如下所示:
在这里插入图片描述
同样,获取一组数据的值就使用values的方法,如下所示:
在这里插入图片描述

DataFrame

DataFrame是表格型数据结构,也就是由一组数据与一组索引组成,在Excel中如下所示:
在这里插入图片描述
创建方法使用的是panda.DataFrame()
可以通过传入单一列表、嵌套列表和字典的方式进行创建,同样,如果不自定义索引的话,其默认索引依旧是0、1、2…如下所示:
在这里插入图片描述
下面是自行指定索引和字典方式传入的:
在这里插入图片描述
cloumns就是行索引,index是列索引
同样,如果要获取行、列索引,使用columns、index的方式

获取数据源

导入文件

1、导入.xlsx文件:read_excel()
.xlsx文件里面的内容如下:
在这里插入图片描述
python导入后如下:
在这里插入图片描述
我们可以使用.head函数来查看前n行数据:
在这里插入图片描述
但是,我们可以看到,这边的索引都是用的默认索引,我们可以替换成自己的行索引,比如用第一列的学号作为行索引:
在这里插入图片描述
同样,列索引也可以进行改变,使用header=n即表示使用第n行作为列索引,不设置即表示默认用第1行作为列索引,但注意的是,header=0表示第一行为列索引,header=1表示第二行为列索引,以此类推
有的时候列太多了,我们只想选取需要的列,于是,可以使用usecols来选取自己需要的列,这个参数用列表传入,如下:
在这里插入图片描述
即便只要一列的数据,也必须用列表。如果要两列:
在这里插入图片描述
此外,还有一个参数,叫sheet_name,表示选择的是第几个sheet,默认是第一个,也就是sheet_name=0。
假如现在创建了一个名为teacher的sheet,内容如下:
在这里插入图片描述
如果想调用它,有两个方式,第一输入sheet的索引,也就是1;第二输入sheet的名字,也就是teacher:
在这里插入图片描述
在这里插入图片描述

查看数据表的大小

使用shape方法
在这里插入图片描述
五行三列
注意的是excel中会把行索引和列索引算进去,但python不会

查看数据类型

使用info()方法
在这里插入图片描述
可以看到,工号的数据类型是int64,一共有4个非null值,姓名的数据类型是object,一共有4个非null值,一共占用内存144bytes

查看数值分布情况

使用describe()方法
但是,describe()方法只能对数值一列作出分布计算
比如说,对于teacher的sheet,就只能对工号一列进行计算:
在这里插入图片描述
由上至下,反别是计数、均值、标准差、最小值、最大值
那对于学生这一sheet,就有以下几列分布计算:
在这里插入图片描述

数据预处理

判断哪个是NAN

使用info()方法,在student的sheet里面插入一个有NAN的数据,再使用info()函数,如下:
在这里插入图片描述
可以看到,分数这一列只有5个非null值,排名一列也只有5个非null值
也可以使用isnull()函数:
在这里插入图片描述
如果是False,表示非null,True的话表示是null

删除缺失值

使用dropna()函数可以删除存在缺失值的那一行:
在这里插入图片描述
如果加一个参数 how=“all” 则表示只删除全为空的那一行

填充缺失值

一般情况下数据缺失比例不高于30%尽量不要选择删除,而是填充
使用fillna()函数,括号中填入要填充的值。
同样也可以指名要填充的那一列和填充值,写在花括号里,不同的列用逗号隔开
在这里插入图片描述
在上面,分数这一列的null值用0填充,排名这一列的null同样也用0填充

删除重复值

使用drop_duplicates()函数,不传入参数的时候表示按所有列进行判断,只有每列的数据都一样才会将重复的行删除,如下
在这里插入图片描述
也可以传入列名作为判断,多个列名用列表传入,列明之间用逗号隔开,使用参数为 subset 如下,
在这里插入图片描述
在这里插入图片描述
这边保留了一个值,可以使用keep参数来选择删除哪个重复值,keep="first"是默认值,表示保留第一个重复的值,keep="last"表示保留最后一个重复值,keep=False表示一个都不保留,如下:
在这里插入图片描述

数据类型转换

之前用info()获得每一列的数据类型,也可以用dtype来获取某一列的数据类型
在这里插入图片描述
python里面的数据类型如下:

类型说明
int整型数
float浮点数
objectPython对象类型,用O表示
string_字符串,用S表示
unicode_固定长度的unicode类型
datetime64时间

用astype()函数来转换数据类型,括号里写入要转换的类型即可,如下:
在这里插入图片描述

设置索引

在导入数据源的时候,通过传入index_col和header可以设置自己需要的行、列索引,在传入之后,也可以通过columns和index方法来添加列、行索引
注意,这个操作是添加索引
如果想要重新设置,那就使用set_index(),括号里填入想要重新设置的列名:
在这里插入图片描述
通过rename()函数来重命名索引,如下所示:
在这里插入图片描述
列索引同理

数据选择

选择列

直接在后面的方括号中致命要选择的列名即可,如果是多个列,需要用列表存起来
在这里插入图片描述
也可以通过索引的方式来选择,这里会使用到iloc方法,iloc[行选择,列选择],如果要单独的行列用逗号隔开,如果要连续的行列用冒号:
在这里插入图片描述
在这里插入图片描述

选择行

无论是具体到哪一行还是好几行使用loc方法和iloc方法均可:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
注意一下连续选择,对于loc和iloc,相同的写法有不同的结果,这是因为loc是完全基于标签位置的索引器,而iloc是完全基于行号的索引器

筛选行

直接传入一个判断条件即可,这种方式叫布尔索引。如果传入的条件是多个的话,用 & 进行连接:
在这里插入图片描述

行列同时选择

依旧对于这样一张表,假设需要调出索引为1、4的行,列名为学号和分数的数据
在这里插入图片描述

loc方法

在这里插入图片描述
第一个列表为选择的行,第二个为选择的列,两个传入的都是行、列的索引

iloc方法

在这里插入图片描述
两个都是通过传入索引的方式

布尔索引+普通索引

在这里插入图片描述

连续的行列

在这里插入图片描述

单个行/列+连续列/行

教材上使用的是ix方法,但这个方法已经被官方淘汰了,如果使用的话,会显示
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing
所以,可以使用loc方法:
在这里插入图片描述

数值操作

数值替换

使用replace(A,B)函数,表示将A替换成B:
比如,将学号里,201701替换成201710:
在这里插入图片描述
之前有fillna填充缺失值,replace也可以,python里面对于缺失值可以用np.NaN表示:
在这里插入图片描述
replace也可以实现多对一的替换,用列表放进来即可:
在这里插入图片描述
也可以进行多对多的替换,其实也就是多个一对一,用字典传入即可:
在这里插入图片描述

数值排序

使用sort_values(by=[列名],ascending=True,na_position=“last”)
by后面接的列表为关键字,如果想设置多个关键字,传入多个列表名即可,越往后关键字等级越低
ascending默认参数True,表示升序,False表示降序,同样也可以写成列表的形式,表示有多个关键字,按照不同的关键字,有不同的排序规则,注意以下要一一对应好
na_position默认参数last,表示将存在缺失值的列放在最后,设置成"first"表示放在第一列的位置
在这里插入图片描述

数值排名

个人认为,数值排名主要针对于有重复值的情况,在没有重复值的情况下,和数值排序没有什么不同,但遇到重复值,会按照给定的方法处理。
使用rank(ascending=True,method=)

method说明
average平均值
first按先后顺序
min最小排名,对应RANK.EQ
max最大排名

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数值删除

删除列

使用drop方法,如果直接传入待删除列的列名或者传入待删除列的位置的话,需要使用一个axis=1的参数,但如果通过传入列表的方式传给columns参数的话,就不要用axis参数:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

删除行

与列相似,但axis要改为0,columns改为index,这边给一个列子好了:
在这里插入图片描述
在python中删除特定的行即为筛选满足条件的行

数值计算

计数

value_counts():
在这里插入图片描述
如果传入参数normalize=True则表示需要查看占比,传入sort=False表示不按照计数值降序排序
在这里插入图片描述

获取唯一值

使用unique方法,或者可以删除重复值
在这里插入图片描述

数值查找

使用isin(),返回的结果是True or False:
在这里插入图片描述

区间切分

使用cut()方法,传入参数bins来指明切分区间,结果为几个左开右闭的区间
在这里插入图片描述

插入列

使用insert()方法,依次传入要插入的位置,新列的列名,插入的数据
在这里插入图片描述

行列互换

.T即可:
在这里插入图片描述

层次化索引

使用stack()函数,可以将表格型数据转化为树形数据
在这里插入图片描述
unstack则是将树形数据转化为表格型数据

数据运算

加减乘除

直接选择需要运算的列进行运算即可:
在这里插入图片描述
其余的同理

比较

两列比较的时候,会对每一对进行比较的数据给出True 和 False的结果:
在这里插入图片描述

计数

使用count()函数来求出每一列的非空数值,如果加上axis=1参数,则表示求每一行的非空数值
在这里插入图片描述
也可以求单独一列的计数

求和

使用sum()函数,对每一列或每一行(axis=1)进行求和:
在这里插入图片描述

求均值

使用mean()函数,对每一列或每一行(axis=1)进行求均值运算:
在这里插入图片描述

求最大、最小值

使用max()、min()函数,求出每一列或每一行(axis=1)的最大值、最小值
在这里插入图片描述

求中位数

使用median()函数,求每一列或每一行(axis=1)的中位数:
在这里插入图片描述

求众数

使用mode()函数,求每一列或每一行(axis=1)的众数:
在这里插入图片描述

求方差

使用var()函数,求每一列或每一行(axis=1)的方差:
在这里插入图片描述

求标准差

使用std()函数,求每一列或每一行(axis=1)的标准差:
在这里插入图片描述

指定列、行运算

如果不对数据做处理就直接运算的话那得到的就是每一列或每一行的结果,如果只想选择其中的几列进行运算,就需要对行、列进行选择。比如在上面的sheet里,想求出每个同学的总分:
在这里插入图片描述

数据分组

根据一个或多个键将数据分成若干组,然后对分组后的数据分别进行汇总计算,再将汇总计算后的结果进行合并。
使用groupby()函数,传入列名会返回一个DataFrameGroupBy对象,该对象里包含着分组以后的若干组数据,但不直接显示,要对分组数据进行汇总计算后才会显示出来
在这里插入图片描述
如果要按多个列进行分组,则将多个列名以列表的形式传给groupby()即可。

aggregate方法

aggregate可以一次使用多个汇总方式
在这里插入图片描述

reset_index方法

reset_index()方法可以对得到的结果进行重置索引
在这里插入图片描述
可以看到,与之前不同的是,多了一列

表拼接

横向拼接

使用merge()函数,括号内填入要拼接的表:
在这里插入图片描述
无论是一对一、一对多、多对多都是针对重复的列中重复的数据进行组合,假如cpp中存在一个学号为201708的数据,但math中没有,那得出来的结果中也没有
可以用on参数来指明公共列,比如上面的结果,用pd.merge(math,cpp,on="学号")来表示,结果是一样的
有的时候,可能两个表中,有“相同”的列,但列名不同,这个时候需要合并,就需要使用left_on、right_on参数来指定了:
在这里插入图片描述
以上这些方法都是内连接方法,merge函数默认的就是内连接,如果想使用其他方法,那就需要改参数,而这些改动都在how参数中

左连接

how=“left”
以左表为基础,右表往左表上拼接,对于左表中有而游标中没有的信息,拼接过来的信息用NaN填充。而右表中有而左表中没有的信息,舍弃:
在这里插入图片描述

右连接

how=“right”
和左连接相似
在这里插入图片描述
可以看到,这下对于201708这一学号,就有了NAN的补充

外连接

how=“outer”
外连接就是取两个表的并集,对于上面两个表,外连接的结果和右连接是一样的

重复列

对于重复的列,merge有参数suffixes来处理,默认是["_x","_y"],也可以自行修改

pd.merge( 表1, 表2, on="公共列" , how="连接方式", suffixes=["重复列_1","重复列_2"] )

纵向拼接

使用concat()方法,但与merge()不同的是,concat传的是列表,也就是,需要将待合并的表名以列表的形式传给pd.concat()方法:
在这里插入图片描述
可以看到,合并之后,索引依旧使用的是原来自己的索引,可以通过修改参数ignore_index=True来产生新的索引:
在这里插入图片描述

数据导出

和导入数据源十分类似,使用to_excel()方法:
参数excel_writer为导出的路径;
sheet_name为设置的sheet名字;
设置index=False表示希望导出的时候把索引去掉;
如果想只导出一部分列,那使用columns=[],里面填写要导出的列名;
设置编码格式用encoding参数,一般选择"utf-8";
对缺失值的填充用na_rep参数;
对无穷值的填充用inf_rep参数;
加入要对在这里插入图片描述这个合并的结果进行导出,并且希望导出的sheet名为“花名册”,只导入姓名和学号两列,不要索引,则如下:

class_all.to_excel(
    excel_writer = r"/home/cxm-irene/python-excel/result.xlsx",
    sheet_name = "class_all",
    index = False,
    columns = ["姓名","学号"],
    encoding = "utf-8"
)

导出的结果如下:
在这里插入图片描述
目前pandas的学习就这么多了,如果后面有新的东西会进行补充…

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值