自学Python

Chapter 9

第9章Python数据分析基础:Pandas模块

章节主张

第9章Python数据分析基础:Pandas模块这一章真正要建立的,不是孤立知识点,而是围绕“Pandas 是把数据表变成分析语言、环境与工具链先于语法细节、基础语法是后续一切抽象的地基”形成一套能反复练习、能迁移到真实任务里的 Python 学习路径。

中文释读

读 第9章Python数据分析基础:Pandas模块 时,不要只把它当作语法或模块说明书。更有价值的读法,是问自己:这一章解决了我在编程、科学计算或数据分析流程中的哪个瓶颈?

这本书的强项在于把工具、基础语法、科学计算库和案例工作流连成一条线。章节页因此会把原书内容翻译成“知识点 -> 操作动作 -> 易错边界 -> 迁移练习”的学习结构。

本章知识路线

关键论据

  • Pandas基于NumPy和Matplotlib构建,提供了一些快速强大而又简单易用的数据结构来处理表格、数据库、时间序列、矩阵等形式的数据,是一个强大的数据分析基础模块。
  • Pandas在数据分析(特别是金融数据分析)上应用广泛。
  • Pandas提供了一些基本的数据分析功能,包括: ●支持缺失值的处理。
  • ●支持CSV、Excel、网页、数据库类型文件的读写。
  • Anaconda中已经集成了Pandas模块。

行动清单

  • 先用最小代码样例跑通本章核心知识点。
  • 把本章知识点接到一个真实小任务上,而不只停留在示例。
  • 记录本章最容易报错的边界条件和调试方式。
  • 复盘:这一章内容如何进入自己的长期 Python 学习系统。

本章图版学习路径

图版按知识点分组,适合拿来做复现、迁移和复盘练习,不只是“看一眼效果”。

源章节深读

9.1 Pandas模块简介

这节解决什么问题:这节要解决的不是背下“9.1 Pandas模块简介”,而是把这个知识点放进真正可运行、可调试、可迁移的 Python 学习流程里。

怎么用到自己的系统:把它写进自己的学习系统:先用最小例子跑通,再把“9.1 Pandas模块简介”迁移到一个实际小任务中,最后记录哪些边界条件最容易报错。

常见错误:常见误区是只记住 API 或代码片段,却没理解 9.1 Pandas模块简介 背后的对象模型、输入输出和适用边界。

Pandas基于NumPy和Matplotlib构建,提供了一些快速强大而又简单易用的数据结构来处理表格、数据库、时间序列、矩阵等形式的数据,是一个强大的数据分析基础模块。Pandas在数据分析(特别是金融数据分析)上应用广泛。 Pandas提供了一些基本的数据分析功能,包括: ●支持缺失值的处理。 ●支持数据的插入和删除。 ●支持与其他常用数据类型的转换。 ●支持对数据的索引和筛选。 ●支持CSV、Excel、网页、数据库类型文件的读写。 Anaconda中已经集成了Pandas模块。可以在命令行使用pip命令更新模块: 常用的导入模式如下: 为了方便,本书使用pd作为Pandas模块的简写。本书使用的Pandas版本如下:

9.2 一维数据结构:Series对象

这节解决什么问题:这节要解决的不是背下“9.2 一维数据结构:Series对象”,而是把这个知识点放进真正可运行、可调试、可迁移的 Python 学习流程里。

怎么用到自己的系统:把它写进自己的学习系统:先用最小例子跑通,再把“9.2 一维数据结构:Series对象”迁移到一个实际小任务中,最后记录哪些边界条件最容易报错。

常见错误:常见误区是只记住 API 或代码片段,却没理解 9.2 一维数据结构:Series对象 背后的对象模型、输入输出和适用边界。

Pandas模块中有两种主要的数据结构:一维数据结构Series和二维数据结构DataFrame,这两种数据结构能够处理各种常见类型的数据。其中,又以二维数据结构DataFrame最为常用。在Pandas中,一维数据结构Series可以存储任意类型的数据,包括整数、浮点数、字符串、Python对象等。 通常,Pandas模块与NumPy模块需要配合使用。导入相关模块: Series对象的构造方法为: 其中,各参数的含义如下: ●data参数可以是列表、元组或者一维数组,也可以是字典,还可以是标量值。 ●index参数是一个与data大小相同的数组或索引,表示Series对象的标记。 ●与NumPy数组一样,Series对象中的数据必须是同一类型的,不指定dtype参数时,Pandas会根据data中的数据进行推断。 根据data参数的不同,Series对象有不同的生成方式。 1.使用数组生成 Series对象可以通过类似一维数组的结构生成: 左栏是该Series对象的标记,即index参数需要指定的内容;右边是对应的数据。在不指定index参数的情况下,标记默认是RangeIndex(n),其中n是data的长度。标记可以用.index属性查看: 可以用标记来索引对应位置的值: Series对象的标记类似于字典,因此与数组不同的是Series不支持负数索引。类似于字典意味着标记可以不是整数。例如,生成一个通过index参数指定标记的Series对象: 用标记进行索引: 查看标记: 2.使用字典生成 Series对象类似于字典,所以也可以通过字典生成,在不给定index参数的情况下,标记默认为字典的键,并按照字典中键的顺序进行排列: Series对象的类型由字典对应的值确定,即整数。如果指定了in

9.3 二维数据结构:DataFrame对象

这节解决什么问题:这节要解决的不是背下“9.3 二维数据结构:DataFrame对象”,而是把这个知识点放进真正可运行、可调试、可迁移的 Python 学习流程里。

怎么用到自己的系统:把它写进自己的学习系统:先用最小例子跑通,再把“9.3 二维数据结构:DataFrame对象”迁移到一个实际小任务中,最后记录哪些边界条件最容易报错。

常见错误:常见误区是只记住 API 或代码片段,却没理解 9.3 二维数据结构:DataFrame对象 背后的对象模型、输入输出和适用边界。

DataFrame对象是一种二维带标记数据结构,不同列的数据类型可以不同。为了方便理解,可以将DataFrame对象看成一张Excel电子表格,或者是一个由多列Series对象构成的字典。 与Series类似,DataFrame对象也可以由多种类型的数据生成: ●由Series对象为值构成的字典。 ●由一维数组或列表构成的字典。 ●由字典构成的列表或数组。 导入相关模块: 1.使用Series对象构成的字典生成 DataFrame对象可以从一组以Series对象为值构成的字典中生成。字典中的值除了Series对象,也可以是另一个字典,因为字典被转换为Series对象。假设有一个包含两个Series对象的字典d: 可以用字典d构造一个DataFrame对象: 与Series相比,DataFrame对象要区分不同的行和列,因此有行标记和列标记之分。默认情况下,df的列标记是传入字典的键,可以用属性.columns查看: 行标记是两个Series对象标记的并集,Pandas会自动将两个Series对象的标记对齐: 在生成DataFrame时,也可以指定index和columns参数。指定参数时,Pandas会按照给定的顺序从传入的数据中寻找对应的值,如果该值不存在,则使用默认值np.nan。例如,指定index: 同时指定index和columns参数: 2.使用一维数组构成的字典生成 DataFrame对象还可以使用由一维数组或列表构成的字典生成,这些数组和列表必须是等长的。以列表构成的字典为例,在不给定index参数的情况下,index默认为RangeIndex(n),n为数组或列表的长度: 传入index参数时,该参数的长度也必须与列表长度一致: 3.使用字典数组生成 DataFrame对象还可

9.4 Pandas对象的索引

这节解决什么问题:这节要解决的不是背下“9.4 Pandas对象的索引”,而是把这个知识点放进真正可运行、可调试、可迁移的 Python 学习流程里。

怎么用到自己的系统:把它写进自己的学习系统:先用最小例子跑通,再把“9.4 Pandas对象的索引”迁移到一个实际小任务中,最后记录哪些边界条件最容易报错。

常见错误:常见误区是只记住 API 或代码片段,却没理解 9.4 Pandas对象的索引 背后的对象模型、输入输出和适用边界。

可以对Pandas中的数据对象进行索引,得到数据的一部分。DataFrame和Series对象支持很多种索引方式。 Pandas数据对象可以使用一对中括号“[]”进行索引操作。导入相关模块: 1.基于中括号的列索引 对于Series对象来说,中括号索引标记返回一个标量;对于DataFrame对象来说,中括号索引列标记,返回该列对应的一个Series对象。 在Pandas中,除了数字和字符串,时间序列也可以用来当作标记。日期时间序列可以用函数pd.date_range()创建: 通过指定index参数,可以构建一个基于时间序列的DataFrame对象: 该对象的行标记为时间序列: .head()方法可以查看前几行的数据,.tail()方法可以查看后几行的数据。不指定查看的行数时,默认显示5行,查看前5行数据: 查看最后2行数据: 用中括号对列A进行索引,可以得到该列对应的Series对象: 该Series对象的标记为原来DataFrame对象的行标记,可以使用时间序列对该Series对象进行索引: 中括号索引还支持用列标记列表操作,得到一个DataFrame对象: 2.基于名称属性的列索引 当列标记的名称是一个合法的Python对象名时,在不与DataFrame对象自带的方法和属性名冲突的情况下,Pandas会自动将该名称转化为一个属性。可以使用该名称对应的属性来对列进行索引,如: Series对象也支持使用标记名称进行属性索引: 3.基于中括号的行切片 Series对象支持切片操作: DataFrame也支持切片操作,与索引不同的是,DataFrame的切片是对行进行操作:

9.5 缺失值的处理

这节解决什么问题:这节要解决的不是背下“9.5 缺失值的处理”,而是把这个知识点放进真正可运行、可调试、可迁移的 Python 学习流程里。

怎么用到自己的系统:把它写进自己的学习系统:先用最小例子跑通,再把“9.5 缺失值的处理”迁移到一个实际小任务中,最后记录哪些边界条件最容易报错。

常见错误:常见误区是只记住 API 或代码片段,却没理解 9.5 缺失值的处理 背后的对象模型、输入输出和适用边界。

Pandas模块支持对有缺失值的数据进行相关处理。导入相关模块: 构建一个DataFrame: DataFrame的行标记可以通过赋值修改: DataFrame的值可以通过.iloc属性修改为缺失值: 这样便得到一个有缺失值的DataFrame对象。可以使用.dropna()方法去掉所有包含缺失值的行,得到一个新的DataFrame: 这里,how参数设为“any”表示只要该行有缺失值就会被去掉,如果换成“all”,则表示只有该行全部缺失时才会被去掉。.dropna()方法还可以通过axis参数指定对行还是对列进行操作,默认值为0,即对行;如果要对列进行操作,可以将axis参数设为1: 也可以用.fill_na()方法为缺失值补上默认值: 这两种方法都返回一个新的DataFrame对象,对原对象不产生影响:

9.6 数据的读写

这节解决什么问题:这节要解决的不是背下“9.6 数据的读写”,而是把这个知识点放进真正可运行、可调试、可迁移的 Python 学习流程里。

怎么用到自己的系统:把它写进自己的学习系统:先用最小例子跑通,再把“9.6 数据的读写”迁移到一个实际小任务中,最后记录哪些边界条件最容易报错。

常见错误:常见误区是只记住 API 或代码片段,却没理解 9.6 数据的读写 背后的对象模型、输入输出和适用边界。

Pandas模块能够读写很多格式的数据,如CSV、ExceL、SQL、JSON、HTML、SAS、Pickle等。在Pandas中,文件通常使用类似pd.read_xxx()形式的函数进行读取,并使用类似.to_xxx()形式的方法进行写入。例如,考虑这样一个DataFrame数据: 可以使用.to_csv()方法将它保存为CSV文件: CSV文件可以用pd.read_csv()函数读取: 与原来的DataFrame对象相比,读取到的对象多了Unnamed:0的列,它是原来DataFrame对象的行标记。在保存的时候,Pandas默认会保存行标记和列标记的值;在读取时,Pandas并不知道这一列是行标记,所以会将其当作普通的数据列读取出来。为了解决这个问题,可以在读取时使用参数index_col指定行标记所在的列: 也可以在保存的时候,忽略行标记: 其他类型文件的读写方法类似,在具体参数上可能会有一些不同,常用的方法如下。 ●pandas.read_csv()函数,.to_csv()方法:CSV格式,逗号分割的文本格式。 ●pandas.read_json()函数,.to_json()方法:JSON格式。 ●pandas.read_html()函数,.to_html()方法:HTML网页上的表格。 ●pandas.read_excel()函数,.to_excel()方法:Excel格式的表格。 值得注意的是,读写Excel时,需要调用一些额外的模块,如xlrd、xlwt、openpyxl等,如果系统没有安装这些模块,需要额外通过pip或者conda安装。

9.7 实例:基于Pandas的期货数据分析

这节解决什么问题:这节要解决的不是背下“9.7 实例:基于Pandas的期货数据分析”,而是把这个知识点放进真正可运行、可调试、可迁移的 Python 学习流程里。

怎么用到自己的系统:把它写进自己的学习系统:先用最小例子跑通,再把“9.7 实例:基于Pandas的期货数据分析”迁移到一个实际小任务中,最后记录哪些边界条件最容易报错。

常见错误:常见误区是只记住 API 或代码片段,却没理解 9.7 实例:基于Pandas的期货数据分析 背后的对象模型、输入输出和适用边界。

通过Pandas模块,可以实现一些简单的数据处理与分析。本节将基于上海商品交易所在2021年的真实期货数据,让读者了解Pandas的基础使用。导入相关的模块: 为了获取2021年的期货数据,需要从上海商品交易所的官网获取数据,网址为: 可以借助数据的URL链接,利用urllib.request模块的urlretrieve()函数直接将该数据下载到本地,命名为“2021.zip”: 利用ziplib模块处理获得的压缩文件: 可以看到,压缩文件中有很多Excel格式的文件,但名字都是乱码。不过,如果用其他方式打开“2021.zip”,会发现这些乱码其实是正常的中文字符,这是由于zipfile库中对zip文件的处理模式造成的,可以通过以下方式对文件名进行还原: 利用.extract()方法和os模块,可以将该文件的内容解压: 利用pathlib模块,查看当前文件夹下解压的Excel文件: 可以利用Pandas读取这些Excel文件,读取Excel文件需要使用read_excel()函数: 可以看到,读取的结果并不符合预期,DataFrame对应的列标记并不是想要的结果,原因是该Excel文件的列标记不在数据的第1行。为了解决这种情况,可以在read_excel()函数中指定header参数: 更进一步,观察到数据的第一列为期货合约名,第二列为时间,可以利用Pandas中的MultiIndex设定,将其转为一个二级行标记: 此时,DataFrame的行列标记都被设定好了。仔细观察发现数据中有很多的缺失值,利用.dropna()方法可以去除全是缺失值的行和列: 可以利用.loc属性,索引得到天然橡胶的期货价格数据,如“ru2201”: 由于2021年的数据是分月存储的,为了得到天然橡胶ru2201一年的完

9.8 本章学习笔记

这节解决什么问题:这节要解决的不是背下“9.8 本章学习笔记”,而是把这个知识点放进真正可运行、可调试、可迁移的 Python 学习流程里。

怎么用到自己的系统:把它写进自己的学习系统:先用最小例子跑通,再把“9.8 本章学习笔记”迁移到一个实际小任务中,最后记录哪些边界条件最容易报错。

常见错误:常见误区是只记住 API 或代码片段,却没理解 9.8 本章学习笔记 背后的对象模型、输入输出和适用边界。

本章对Pandas模块的使用进行了简单的介绍。Pandas模块在处理数据时有天然的优势,很多操作和用法需要在实践中慢慢积累。 学完本章,读者应该做到: ●掌握Pandas中的两种基本结构。 ●熟悉如何使用DataFrame对象及其索引。 ●熟悉如何使用Pandas读写表格数据。 1.本章新术语 本章没有涉及新术语。 2.本章新函数 本章涉及的新函数见表9-1。 表9-1 本章涉及的新函数 3.本章Python 2与Python 3的区别 本章不涉及Python 2与Python 3的区别。

辨析题:如果你只会照抄 第9章Python数据分析基础:Pandas模块 里的例子,却无法换一个输入自己写出来,真正缺的是什么?

多数时候缺的不是记忆,而是对象模型、输入输出边界和操作顺序的理解。把知识点换到新输入上依然能运行,才算真的进入了自己的系统。