Pandas
为什么学习 Pandas?
进入大数据时代,感觉我们如果不会一些分析数据的能力,就将要被时代淘汰(明目张胆拉焦虑)。
不过好在现在的技越来越先进,越来越易用,而且网络上也有越来越多的教学内容。 只要你有一些耐心,入门其实并不难。
有朋友一路跟着我的交互式教学,上手了 Python 基础, 学会了使用 Numpy 高效的数据加工计算 这两门非常有趣,而且在浏览器中都能运行代码,实现你独特想法的教学。
那么现在我们将要步入新的阶段,对大数据做出新的定义,直面大数据带来的挑战,学会使用 Pandas 来处理你日常的表格/画图/数据分析等问题。
我们正在面临的问题
大数据虽然描述的是海量的数据,但是大数据离你却并不远,特别是大数据所涵盖的技术,在你生活当中,是时刻都能使用这些大数据涉及到的技术, 来解决你生活中的具体问题。
比如我们在中学甚至更早就已经开始接触使用 Excel 了。就像我现在其实还不会编程,但是已经可以熟练使用 Excel 当中的公式, 在有次土立方相关的复杂计算时,我用 Excel 写出了当时全年级都广为流传的自动运算考题工具。当时我也就只是想偷懒,解决自己的计算问题,但是没想到, 同学比我更懒,拿着这份 Excel 开始传播起来。 等我发现全班都在用我的 Excel 时,真是震惊了。我想这就是我开始想要学编程,想要更自由的做出有效工具的萌芽吧。
其实当你也有想解决的数据问题,不管是一份考题,还是工作总结,拥有了这种处理数据的能力后,不光是你自己,就可能连身边的人都会受益于你的能力。
今天要讲的是 Pandas,是什么时候才会让我想要使用 Pandas 来处理问题呢?我下面列一条,说不定就有你正面临的问题:
办公自动化;
上学上班,有 Excel 或者格式化的文本文件,需要进行数据加工处理;
对大量的这些文本文件作图,想要自动化处理;
人工智能;
数据分析,可视化数据规律;
数据前处理,为 AI 模型展平道路。
Pandas 是什么
Pandas 库是一个免费、开源的第三方 Python 库,是 Python 数据分析 必不可少的工具之一,它为 Python 数据分析提供了高性能,且易于使用的数据结构,即 Series 和 DataFrame。Pandas 自诞生后被应用于众多的领域,比如金融、统计学、社会科学、建筑工程等。
Pandas 库基于 Python NumPy 库开发而来,因此,它可以与 Python 的科学计算库配合使用。Pandas 提供了两种数据结构,分别是 Series(一维数组结构)与 DataFrame(二维数组结构),这两种数据结构极大地增强的了 Pandas 的数据分析能力。在本套教程中,我们将学习 Python Pandas 的各种方法、特性以及如何在实践中运用它们。
Pandas 这个名字来源于面板数据(Panel Data)与数据分析(data analysis)这两个名词的组合。在经济学中,Panel Data 是一个关于多维数据集的术语
Pandas 最初由 Wes McKinney(韦斯·麦金尼)于 2008 年开发,并于 2009 年实现开源。目前,Pandas 由 PyData 团队进行日常的开发和维护工作。在 2020 年 12 月,PyData 团队公布了最新的 Pandas 1.20 版本 。
在 Pandas 没有出现之前,Python 在数据分析任务中主要承担着数据采集和数据预处理的工作,但是这对数据分析的支持十分有限,并不能突出 Python 简单、易上手的特点。Pandas 的出现使得 Python 做数据分析的能力得到了大幅度提升,它主要实现了数据分析的五个重要环节:
加载数据
整理数据
操作数据
构建数据模型
分析数据
Pandas主要特点
Pandas 主要包括以下几个特点:
它提供了一个简单、高效、带有默认标签(也可以自定义标签)的 DataFrame 对象。
能够快速得从不同格式的文件中加载数据(比如 Excel、CSV 、SQL文件),然后将其转换为可处理的对象;
能够按数据的行、列标签进行分组,并对分组后的对象执行聚合和转换操作;
能够很方便地实现数据归一化操作和缺失值处理;
能够很方便地对 DataFrame 的数据列进行增加、修改或者删除的操作;
能够处理不同格式的数据集,比如矩阵数据、异构数据表、时间序列等;
提供了多种处理数据集的方式,比如构建子集、切片、过滤、分组以及重新排序等。
上述知识点将在后面的教学中为大家一一讲解。
Pandas 的主要优势
与其它语言的数据分析包相比,Pandas 具有以下优势:
Pandas 的 DataFrame 和 Series 构建了适用于数据分析的存储结构;
Pandas 简洁的 API 能够让你专注于代码的核心层面;
Pandas 实现了与其他库的集成,比如 Scipy、scikit-learn 和 Matplotlib;
Pandas 官方网站(点击访问)提供了完善资料支持,及其良好的社区环境。
Pandas内置数据结构
我们知道,构建和处理二维、多维数组是一项繁琐的任务。Pandas 为解决这一问题, 在 ndarray 数组(NumPy 中的数组)的基础上构建出了两种不同的数据结构,分别是 Series(一维数据结构)DataFrame(二维数据结构):
Series 是带标签的一维数组,这里的标签可以理解为索引,但这个索引并不局限于整数,它也可以是字符类型,比如 a、b、c 等;
DataFrame 是一种表格型数据结构,它既有行标签,又有列标签。
下面对上述数据结构做简单地的说明,大家可以参考一下:
Pandas库下载和安装
Python 官方标准发行版并没有自带 Pandas 库,因此需要另行安装。除了标准发行版外,还有一些第三方机构发布的 Python 免费发行版, 它们在官方版本的基础上开发而来,并有针对性的提前安装了一些 Python 模块,从而满足某些特定领域的需求,比如专门适应于科学计算领域的 Anaconda,它就提前安装了多款适用于科学计算的软件包。
对于第三方发行版而言,它们已经自带 Pandas 库,所以无须另行安装。下面介绍了常用的免费发行版:
1.Anaconda(官网下载:https://www.anaconda.com/)是一个开源的 Python 发行版,包含了 180 多个科学包及其依赖项。除了支持 Windows 系统外,也支持 Linux 和 Mac 系统。
2.Python(x,y)(下载地址:添加链接描述)是一款基于 Python、Qt (图形用户界面)和 Spyder (交互式开发环境)开发的软件,主要用于数值计算、数据分析和数据可视化等工程项目,目前只支持 Python 2 版本。
3.WinPython(下载地址:添加链接描述)一个免费的 Python 发行版,包含了常用的科学计算包与 Spyder IDE,但仅支持 Windows 系统。
下面介绍在不同操作系统环境下,标准发行版安装 Pandas 的方法。
Windows系统安装
使用 pip 包管理器安装 Pandas,是最简单的一种安装方式。在 CMD 命令提示符界面行执行以下命令:
pip install pandas
Linux系统安装
对于不同的版本的 Linux 系统,您可以采用它们各自的包管理器来安装 Pandas。
- Ubuntu用户
Pandas 通常需要与其他软件包一起使用,因此可采用以下命令,一次性安装所有包:
sudo apt-get install numpy scipy matplotlib pandas
- Fedora用户
对于 Fedora 用户而言,可采用以下命令安装:
sudo yum install numpy scipy matplotlib pandas
MacOSX系统安装
对于 Mac 用户而言,同样可以直接使用 pip 包管理器来安装,命令如下:
pip install pandas
Pandas index操作索引
索引(index)是 Pandas 的重要工具,通过索引可以从 DataFame 中选择特定的行数和列数,这种选择数据的方式称为“子集选择”。
在 Pandas 中,索引值也被称为标签(label),它在 Jupyter 笔记本中以粗体字进行显示。索引可以加快数据访问的速度,它就好比数据的书签,通过它可以实现数据的快速查找。
创建索引
通过示例对 index 索引做进一步讲解。下面创建一个带有 index 索引的数据,并使用 read_csv() 这些读取数据:
import pandas as pd data = pd.read_csv("person.csv") print(data)
输出结果:
ID Name Age City Salary
0 1 Jack 28 Beijing 22000
1 2 Lida 32 Shanghai 19000
2 3 John 43 Shenzhen 12000
3 4 Helen 38 Hengshui 3500
通过列索引(标签)读取多列数据:
import pandas as pd #设置"Name"为行索引 data = pd.read_csv("person.csv", index_col ="Name") # 通过列标签选取多列数据 a = data[["City","Salary"]] print(a)
输出结果:
City Salary
Name
Jack Beijing 22000
Lida Shanghai 19000
John Shenzhen 12000
Helen Hengshui 3500
再看一组简单的示例:
import pandas as pd info =pd.read_csv("person.csv", index_col ="Name") #获取单列数据,或者以列表的形式传入["Salary"] a =info["Salary"] print(a)
输出结果:
Salary
Name
Jack 22000
Lida 19000
John 12000
Helen 3500
设置索引
set_index() 将已存在的列标签设置为 DataFrame 行索引。除了可以添加索引外,也可以替换已经存在的索引。比如您也可以把 Series 或者一个 DataFrme 设置成另一个 DataFrame 的索引。示例如下:
info = pd.DataFrame({'Name': ['Parker', 'Terry', 'Smith', 'William'], 'Year': [2011, 2009, 2014, 2010], 'Leaves': [10, 15, 9, 4]}) #设置Name为行索引 print(info.set_index('Name'))
输出结果:
Year Leaves
Name
Parker 2011 10
Terry 2009 15
Smith 2014 9
William 2010 4
重置索引
您可以使用 reset_index() 来恢复初始行索引,示例如下:
import pandas as pd import numpy as np info = pd.DataFrame([('William', 'C'), ('Smith', 'Java'), ('Parker', 'Python'), ('Phill', np.nan)], index=[1, 2, 3, 4], columns=('name', 'Language')) print(info) print(info.reset_index())
输出结果:
重置前:
name Language
1 William C
2 Smith Java
3 Parker Python
4 Phill NaN
重置后:
index name Language
0 1 William C
1 2 Smith Java
2 3 Parker Python
3 4 Phill NaN
Pandas分层索引
分层索引(Multiple Index)是 Pandas 中非常重要的索引类型,它指的是在一个轴上拥有多个(即两个以上)索引层数,这使得我们可以用低维度的结构来处理更高维的数据。比如,当想要处理三维及以上的高维数据时,就需要用到分层索引。
分层索引的目的是用低维度的结构(Series 或者 DataFrame)更好地处理高维数据。通过分层索引,我们可以像处理二维数据一样,处理三维及以上的数据。分层索引的存在使得分析高维数据变得简单,让抽象的高维数据变得容易理解,同时它比废弃的 Panel 结构更容易使用。
Pandas 可以通过 MultiIndex() 方法来创建分层索引对象,该对象本质上是一个元组序列,序列中每一个元组都是唯一的。下面介绍几种创建分层索引的方式。
创建分层索引
通过 MultiIndex() 的levels参数能够直接创建分层索引,示例如下:
import pandas as pd import numpy as np #为leves传递一个1行5列的二维数组 df=pd.MultiIndex(levels=[[np.nan, 2, pd.NaT, None, 5]], codes=[[4, -1, 1, 2, 3, 4]]) print(df.levels) print(df)
输出结果:
[[nan, 2, NaT, None, 5]]
MultiIndex([( 5,),
(nan,),
( 2,),
(nan,),
(nan,),
( 5,)],
)
上述代码中,levels参数用来创建层级索引,这里只有一层,该层的索引值分别是 np.nan, 2, NaT, None, 5;codes表示按参数值对层级索引值排序(与 levels 中的值相对应),也就说 codes 中数值是 leves 序列的下标索引。需要注意,这里的 -1 代表 NaN。
- 从元组创建
通过 from_tuples() 实现从元组创建分层索引。
#创建元组序列 arrays = [['it', 'it', 'of', 'of', 'for', 'for', 'then', 'then'], ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']] #使用zip()函数创建元组 tuples = list(zip(*arrays)) print(tuples)
输出结果如下:
[(‘it’, ‘one’),
(‘it’, ‘two’),
(‘of’, ‘one’),
(‘of’, ‘two’),
(‘for’, ‘one’),
(‘for’, ‘two’),
(‘then’, ‘one’),
(‘then’, ‘two’)]
然后使用 tuples 创建分层索引,如下所示:
import pandas as pd #创建了两层索引,并使用names对它们命名 index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second']) print(index)
输出结果:
MultiIndex([( ‘it’, ‘one’),
( ‘it’, ‘two’),
( ‘of’, ‘one’),
( ‘of’, ‘two’),
( ‘for’, ‘one’),
( ‘for’, ‘two’),
(‘then’, ‘one’),
(‘then’, ‘two’)],
names=[‘first’, ‘second’])