数据分析与处理第三方库-Pandas

Pandas 是一种基于 NumPy 的开源的数据分析和处理工具包,提供了高性能、简单易 用的数据结构和数据分析函数。Pandas提供了方便的类表格和类SQL的操作,同时提供了 强大的缺失值处理方法,通过Pandas可以方便的进行数据导入、选取、清洗、处理、合 并、统计分析等操作。

Python 标准库中默认不包含 Pandas,需要自己下载安装:

  • 命令行安装 pip install pandas
  • 借助于第三方包管理软件,例如Anaconda

基本结构之Series

Pandas 中的 Series 对象可以理解为带有标签数据的一维数组,标签在Pandas中有 对应的数据类型“Index”,Series类似于一维数组与字典的结合。

(1)Series 对象的创建

创建Series时,可通过index参数指定索引,未指定索引时,采用默认索引,从0开 始,不断递增;创建Series的主要方式如下:

  • 通过列表、元组创建:索引大小必须和列表大小一致;
  • 通过numpy的ndarray创建:必须是一维数组,且数组大小和索引大小要一致;
  • 通过字典创建:默认索引为字典的关键字,指定索引时,会以索引为键获取值,没 有值时,默认为NaN;
  • 通过标量创建 :重复填充标量到每个索引上;

创建好Series对象后,可通过values 属性获取具体值,类型为一维ndarray;可通 过index 属性获取相应索引,类型为Index;

(2)Index 对象介绍

Pandas 的 Index 对象可以看作是一个不可变数组,Index 对象中可以包含重复值。 可直接通过Pandas中的Index类创建Index对象,也可以通过Series或DataFrame中的 index 属性 获取对应的Index对象。Index对象可以在多个数据间共享。例如:

Index 对象的很多操作都与 numpy 中的数组类似,例如支持索引和切片操作,支持 Numpy 中的一些常见函数,拥有size,shape,ndim 等属性。不同的是Index 对象的值是 不可变的。Index 对象的不可变特征使得多个数据之间进行索引共享时更加安全, 可避 免因修改索引时而导致的副作用。

Index 对象也支持集合操作,例如如并集、 交集、 差集等,这些操作也可以通过调 用对象方法来实现。不同的是操作结果中可能会存在重复的元素。

(3)Series 中数据的访问

Series 对象与 numpy 中的一维数组 和 字典 dict 在很多方面都类似。Series 对 象中数据访问可与它们进行类比学习。

将Series看作字典
  •  字典中的键不允许重复,但Series中的索引允许有重复值;
  •  以索引为键,可访问对应的值,如果有多个,则结果为Series类型;
  • 可调用字典的一些常见方法,如keys()、items()等,可判断是否包含指定索引;
  • 可用字典类似语法更新数据,对已有的索引进行赋值,会修改索引对应的值,对一个不存在的索引进行赋值,会添加一个索引。

系统一般会为Series对象默认分配一个从0开始不断增大的索引,称为隐式索引; 用户通过index指定的索引称为显式索引。如果显式索引为整数,容易冲突,通过键访问 采用的是显式索引,通过切片访问采用的是隐式索引,尽量不要使用整数作为显式索引。 其他情况下,两种方式可以共存。

将Series看作一维数组
  • 可以通过索引、切片、布尔表达式访问数据;
  •  通过切片访问时,显式索引结果包含最后一个索引,隐式索引结果不包含最后一个 索引。

索引器:loc、iloc
  • loc: 显式索引访问,即根据用户指定的索引访问
  • iloc: 隐式索引访问,即根据位置序号访问

Series 中常用方法
  • sort_index():对Series按照索引排序,生成一个新的Series对象;
  •  sort_values():对Series按照值排序,生成一个新的Series对象;
  •  rank():对值进行排名,从1开始,对于相同的值默认采用平均排名;
  •  reindex():重新设置索引,生成一个新的Series对象。新的索引长度和原始索引长度可以不相 同,如果新的索引不在原始数据中,则对应的值为NaN,如果在原始数据中,则值保持不变,可 通过method 参数指定值填充的方案(要求原始索引是递增的),还可通过fill_value参数指定 填充值;
  •  Series对象也可执行numpy中的一些运算,此时只对值进行操作,索引和值之间的对应关系不 变;
  • Series对象之间执行运算时,会自动进行对齐,相同索引之间执行相应运算,不同索引对应的 值为NaN。

基本结构之DataFrame

DataFrame 可以看作是一种既有行索引, 又有列索引的二维数组,类似于Excel表 或关系型数据库中的二维表,是Pandas中最常用的基本结构。前面介绍的Series只有一 列数值,DataFrame中往往有多列数值,一列可以看成是一个Series组成。

(1)DataFrame 的创建

可通过值为一维ndarray,list, dict 或者Series的字典或列表;二维的 ndarray;单个Series、列表、一维数组,此时DataFrame中只有一列;其他的 DataFrame 等创建;

创建DataFrame时,可通过 index 和 columns 参数指定 行索引 和 列索引 ,若没 有指定索引,则系统会提供默认索引,从0开始不断增大;

通过多个Series创建DataFrame时,多个Series对象会自动对齐,即多个Series对 象会根据行索引自动匹配,行索引相同的放在同一行。若指定了 index ,则会以指定的 索引为准,去匹配已有的值,丢弃所有未和 index匹配的数据 ,如果指定的索引没有提 供对应的值,则表示该值缺失,使用NaN。

(2)DataFrame 中数据访问

DataFrame 对象与二维 numpy 数组 和 共享索引的若干个Series对象构成的字典有 很多相似之处,DataFrame中数据的访问可与它们进行类比学习。

将 DataFrame 看作字典
  • 以列的索引为关键字,获取某一列数据,例如d_1[列索引],结果为Series对 象,可进一步获取某个数据,例如d_1[列索引][行索引],需要使用两个中括号, 不能合并;
  •  如果列的索引为字符串,则可以列名为属性名,获取某一列数据,例如d_1.属性 名,前提是列名符合标识符的命名规范。如果列名不符合规范或与 DataFrame 中 属性相同,例如shape、index等,则不能用属性形式。

与Series类似,DataFrame中也存在隐式索引和显式索引。显式索引主要是根据用户指定的索引访问数据,而隐式索引主要是根据系统生成的索引即位置序号访问数据。 DataFrame 也支持索引器访问数据,其中loc[行索引, 列索引]通过显示索引访问数据, iloc[行索引, 列索引]通过隐式索引访问数据。

将DataFrame 看作二维数组
  • 支持行列转置、布尔表达式等; 
  • 支持行切片操作,不支持列切片。若想访问多列数据,可将多个列索引放在一个列 表中,例如d_1[[列1,列2]];

(3)DataFrame 常见属性

  • shape:获取形状信息,结果为一个元组;
  • dtypes:获取各字段的数据类型,结果为Series;
  • values:获取数据内容,结果通常为二维数组;
  • columns:获取列索引,即字段名称,结果为Index;
  • index: 获取行索引,即行的标签,结果为Index。
  • axes:同时获取行和列索引,结果为Index的列表;

(4)DataFrame 常见方法

(5)DataFrame 的合并操作

DataFrame 中提供了一个join()方法用于将其他DataFrame中的列合并到当前 DataFrame 中,类似于数据库中的连接,支持内连接(只保留两个对象中都存在的行索引 对应的数据)、外连接(保留两个对象中,只要有一方存在的行索引对应的数据,如果另一 方不存在则相应值为NaN)、 左连接(只保留左边对象中的所有行索引对应的数据)和右连 接(只保留左边对象中的所有行索引对应的数据)等,默认情况采用左连接。join()方法 合并数据时,默认根据两个对象的行索引进行匹配连接,如果有相同列名,则需指定后缀 以区分,否则会出错,也可通过on参数指定合并时参考的列,此时需将该列作为其他对 象的行索引,也就是说让另一个对象的行索引和当前对象的on进行匹配。

Pandas 中的常用方法

Pandas 中提供了大量的数据分析和处理的方法,包括数据的加载与显示、缺失值的处理、数据的分组、数据的合并等等。

(1)数据加载方法

Pandas 中提供了大量的从不同格式文件中加载数据的方法,例如读取Excel文件、 CSV 文件、Json格式文本、HTML网页等等,大家可以根据实际需求,选择相应的方法,每 个方法根据文件特征需要传递的参数不同,可关联源代码查看详情。主要的方法如下:

  • read_excel():从 excel文件中读取数据;  read_csv():从csv文件中读取数据;
  •  read_clipboard():从剪切板中数据;  read_html():从网页中读取数据; 
  • read_json():从 json 格式文本中读取数据;  read_pickle():从 pickle 文件中读取数据; 
  • ……

在此,以实际应用中使用比较广泛的Excel文件读取为例,介绍一些核心的参数含 义。

  • io:文件路径,可以是本地文件也可以是网络文件,支持xls、xlsx、xlsm等格 式;
  •  sheet_name:表单序号或名称,可以是一个列表,表示同时读取多个表单,默认为 第一个表单
  •   hearder:表头,可以是整数或整数列表,默认为第一行;
  • names:指定列名,默认为表头;  index_col:索引列,可以是整数或整数列表;
  •  usecols:使用到的列,默认加载所有列,如果需要加载某些列可指定这些列的序 号;
  •  dtype:指定每一列的数据类型; 
  • skiprows:跳过多少行,常用于表的最开始几行为说明性文档的情景; 
  • nrows:解析多少行;
  • na_values:指定哪些值被看做是缺失值;

(2)数据显示的方法及关键属性

Pandas 中提供了数据显示的一些默认设置,例如默认显示60行,超过60 行只显示前5行、后5行其他都用省略号表示等。可通过一些方法更改设置, 相应方法如下:

  • get_option(属性名):获取相应的属性值;
  • set_option(属性名,值):设置相应的属性值;
  • reset_option(属性名):重置相应的属性值,恢复成默认值;
  • describe_option(属性名):获取相应的属性描述信息,包括默认值,当前值等信 息;
  • option_context(属性名):设置临时的属性值,主要用于上下文管理器中;

显示设置中经常使用到的一些属性如下:

  • display.max_rows:显示的最大行数,默认为60行,超过60行时,只显示前5 行、后5行,其他行用省略号表示,None表示不限制,显示所有行;
  •  display.max_columns:显示的最大列数,默认为0,根据宽度自动确定,显示不 下时,中间列用省略号表示,None表示不限制,显示所有;
  •  display.expand_frame_repr:是否换行打印超过宽度的数据,默认为True,当不 限制列的数量,同时一行又放不下那么多列信息时,默认会自动换行,可设置为 False,这样会添加水平滚动条,在一行显示;
  •  display_max_colwidth:显示的最大列宽,默认为50个字符,超出以省略号表 示,None表示不限制;
  • display.precision:设置小数显示精度,默认为6位。

(3)缺失值处理方法

缺失值是指数据集中的某些值为空。常见的处理方法有:删除法、替换法和插补法。

  •  删除法:直接将包含缺失值的记录删除,常用于缺失值比例非常低,如5%以内;
  • 替换法:用某种值直接替换缺失值,例如连续变量的均值或中位数,离散变量的众 数等; 
  • 插补法:根据其他已观测值进行预测,例如K近邻、回归插补法等; Pandas 中提供了强大的缺失值处理,相关方法如下: 
  • dropna():删除包含缺失值的行,可通过axis参数设置删除所在列,通过thresh 参数指定阈值,只有非空值大于该阈值的行或列才保留; 
  • fillna():用指定值填充缺失值,可为不同的列指定不同的填充值,此时传递一个 字典,键为列名,值为该列缺失值的填充值,可通过method参数指定填充方式; 通过limit参数限定填充的数量; 
  • isna()或isnull():判断元素是否为缺失值,如果元素为缺失值,则对应位置为 True,否则为False。

(4)Pandas 中的分组操作

分组操作主要是根据某个或某些特征对原始数据进行分割,然后可以在子集上应用一 些函数,例如聚合、转换、过滤等,Pandas中的分组通过groupby函数实现。Series 和 DataFrame 都支持分组操作。分组后将得到一个分组对象,通过groups属性可查看分组 信息,通过get_group()可获取某个组详情,通过agg()可对组执行聚合函数,通过transform()方法可对组进行转换,通过filter()方法对某些组进行过滤。

(5)Pandas 中的数据合并操作

数据合并是指将多个数据按照一定的规则合并到一起。在实际应用中,常常涉及多个 数据的联合操作,而这些数据又保存在不同的文件中,此时需要先进行合并,再执行相关 操作。Pandas中提供了一些数据合并的方法,例如merge()、contact()等。

① merge()方法,按照某列或某些列将两个数据对象进行合并,与前面介绍的 DataFrame 中的join()方法非常相似。

  • left:左边的数据对象; 
  • right:右边的数据对象; 
  • how:连接方式,默认为inner,此外还有left、right、outer等; 
  • on:连接的列名称,必须在两个对象中,默认以两个对象的列名的交集作为连接 键; 
  • left_on:左边对象中用于连接的键的列名; 
  • right_on:右边对象中用于连接的键的列名; 
  • left_index:使用左边的行索引作为连接键; 
  • right_index:使用右边的行索引作为连接键; 
  • sort:是否将合并的数据排序,默认为False; 
  • suffixes:列名相同时,指定的后缀;

② contact()方法,沿着一条轴,将多个对象堆叠起来,关键参数如下: 

  • objs:需合并的对象序列; 
  • axis:指定合并的轴,0/‘index’, 1/‘columns’,默认为0; 
  • join:连接方式,只有inner和outer,默认为outer; 
  • ignore_index:是否忽略索引,默认为False; 
  • verify_integrity:验证完整性,较为耗时,默认为False;

Pandas 处理数据综合案例

以高校信息表为例。使用Pandas中的 read_excel() 读取数据,完成下列操作 

  • 显示所有行列数据内容,没有省略; 
  • 只显示招生单位名称和所在省份信息;
  • 只显示江西省高校信息;
  • 只显示江西省或湖南省高校信息; 
  • 对所有数据按招生单位名称排序; 
  • 将所有的空值填充为“未知”; 
  • 将所有的“西藏自治区”改为“西藏”; 
  • 统计各个省份高校的数量; 
  • 只显示北京的985高校信息; 
  • 只显示所有的“师范”院校信息。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐