5.3 Pandas
Pandas模块是一个强大的数据分析和处理工具。它提供快速、灵活、富有表现力的数据结构,能为复杂情形下的数据提供坚实的基础分析功能。所谓复杂情形,可能有以下3种:
·数据库表或Excel表,包含了多列不同数据类型的数据(如数字、文字)。
·时间序列类型的数据,包括有序和无序的情形,甚至是频率不固定的情形。
·任意的矩阵型/二维表/观测统计数据,允许独立的行或列带有标签。
对于数据科学家,和数据打交道的流程可以分为几个阶段:清洗数据、分析和建模、组织分析的结果并以图表的形式展示出来。举个例子,如果我们要处理多个城市一段时间内的天气观测数据,那可能会对数据分析工具提出以下需求:处理丢失的部分数据记录、取出某城市的相关数据子集、将分析结果合并、对数据做分组聚合等。幸运的是,这些功能在Pandas模块中都已经被实现,并且提供了方便的函数接口。
接下来,将会详细介绍Pandas模块中基本的高级数据结构,以及学习如何使用Pandas模块中经典的数据分析和处理方法,以提高数据分析的效率。
官方提倡的模块导入语法为:import pandas as pd。
1.Pandas中的高级数据结构
为了开始使用Pandas,你需要熟悉两个重要的数据结构:系列(Series)和数据框(DataFrame)。有了它们,你可以利用Pandas在计算机内存中构建一个虚拟的数据库。
2.数据框
我们首先介绍数据框,它的结构与矩阵神似,但与矩阵不同。数据框中每列表示一个变量,每行则是一次观测,行列交汇的某个单元格,对应该变量的某次具体的观测值,如图5-1所示。
图5-1 数据框示例
数据框有行和列的索引(index),能让你快速地按索引访问数据框的某几行或某几列,在DataFrame里的面向行和面向列的操作大致是对称的。
有很多方法来创建一个数据框,但最常用的是用一个包含相等长度列表的字典或NumPy数组来创建。需要注意的是:数据框创建时会根据内置的多种规则对数据进行排序,导致结果的行列位置可能不一样,但数据的对应关系不会出现任何错位。代码清单5-6为创建数据框实例。
代码清单5-6 创建数据框
import pandas as pd # 为 pandas取一个别名 pd data = {'id': ['Jack', 'Sarah', 'Mike'], 'age': [18, 35, 20], 'cash': [10.53, 500.7, 13.6]} df = pd.DataFrame( data) # 调用构造函数并将结果赋值给 df print df # result: # age cash id # 0 18 10.53 Jack # 1 35 500.70 Sarah # 2 20 13.60 Mike
*代码详见:示例程序/code/5-3.py
从上述代码的输出可以观察到:由于没有显式声明,行索引自动分配,并且对列名(列索引)进行了排序。而代码清单5-7应用了pd.DataFrame()中更高级的参数设置,显式地声明了列名排序方式和行索引。
代码清单5-7 创建数据框的高级用法
df2 = pd.DataFrame(data, columns=['id', 'age', 'cash'],index=['one', 'two', 'three']) print df2 # result: # id age cash # one Jack 18 10.53 # two Sarah 35 500.70 # three Mike 20 13.60
*代码详见:示例程序/code/5-3.py
获取数据框中的某一列是非常方便的,我们只需要呼唤它的名字,如代码清单5-8所示。
代码清单5-8 获取数据框的某一列
print df2['id'] # result: # 0 Jack # 1 Sarah # 2 Mike # Name: id, dtype: object
*代码详见:示例程序/code/5-3.py
3.系列
代码清单5-8实际上得到了一个系列。顾名思义,系列是对同一个属性进行多次观测之后得到的一列结果。用统计学的语言说,它们服从某种分布。我们可以认为,系列是一种退化的数据框,也可以认为它是一种广义的一维数组。在默认情况下,系列的索引是自增的非负整数列(0,1,2,3,…)。值得注意的是,同个系列的数据共享一个列名,而数组不要求。在时间序列(Time Series)的相关问题中,系列(Series)这一数据结构有宝贵的价值。创建系列的代码如代码清单5-9所示。
代码清单5-9 创建系列
s = pd.Series({'a': 4, 'b': 9, 'c': 16}, name='number') print s # result: # a 4 # b 9 # c 16 # Name: number, dtype: int64
*代码详见:示例程序/code/5-3.py
4.基础数据处理方法
系列可以认为是数据框的一个子集。因此,应首先关注系列的基础操作。代码清单5-10为按下标访问数据的实例。
代码清单5-10 按下标访问(call-by-index)
print s[0] # result: 4 print s[:3] # result: # a 4 # b 9 # c 16 # Name: number, dtype: int64
*代码详见:示例程序/code/5-3.py
类似于数组,系列支持按索引访问内容,如代码清单5-11所示。更有趣的是,系列还支持类似字典的访问方式——按键值(列名)访问。
代码清单5-11 按索引访问(call-by-Index)
print s['a'] # result: 4 s['d'] = 25 # 如果系列中本身没有这个键值,则会新增一行 print s # result: # a 4 # b 9 # c 16 # d 25 # Name: number, dtype: int64
*代码详见:示例程序/code/5-3.py
同时,作为一种高级数据结构,系列同样支持向量化操作。也就是说,我们能够同时对一个系列的所有取值执行同样的操作,一致地应用某种方法,如代码清单5-12所示。
代码清单5-12 向量化操作(Vectorized operations)
import numpy as np printnp.sqrt(s) # result: # a 2.0 # b 3.0 # c 4.0 # d 5.0 # Name: number, dtype: float64 print s*s # result: # a 16 # b 81 # c 256 # d 625 # Name: number, dtype: int64
*代码详见:示例程序/code/5-3.py
数据框可被看作是一个字典,其中字典的键是系列对应的名字(列名),字典的取值是系列所有的观测值。如代码清单5-6中提到的data变量。因此,增、删、改、查等操作的语法大致是相同的,如代码清单5-13所示。
代码清单5-13 数据框列的查、增、删
printdf['id'] # 按列名访问 (call-by-column) # result: # one Jack # two Sarah # three Mike # Name: id, dtype: object df['rich'] = df['cash'] > 200.0 printdf # result: # age cash id rich # 0 18 10.53 Jack False # 1 35 500.70 Sarah True # 2 20 13.60 Mike False deldf['rich'] printdf # result: # age cash id # 0 18 10.53 Jack # 1 35 500.70 Sarah # 2 20 13.60 Mike
*代码详见:示例程序/code/5-3.py
随着读者研究的不断深入,很快便会在阅读Pandas官方文档[1] 的过程中意识到:许多数据框能够支持的功能,如统计频数和分组聚集等,都能够在系列下找到相似的实现;只不过数据框允许你对多列的数据同时进行操作,如以多个标准(性别×年龄)分组。
由于篇幅所限,在此仅能给读者介绍基本的概念和用法。下面附一张Pandas常用方法清单,如表5-2所示,帮助读者更快掌握利用Pandas进行数据分析和处理的基本要领。
表5-2 Pandas常用方法清单
由上述方法体现的功能可看出,Pandas模块已经为各种数据分析与处理的刚需实现了对应的方法。在官方文档中将能看到更多详细的参数设置说明。相信拥有了这一把“瑞士军刀”,读者进行数据分析时将会如鱼得水。Pandas模块支持我们将数据快速读入内存之中,并以此创建一个数据框。简而言之,有了Pandas,我们就能拥有一个“内存中的数据库”。希望读者记住,我们能够通过SQL语句对数据库完成的操作,在数据框中都能更有效率地完成。唯一的不足之处是:内存通常是非常有限的资源。
[1] Pandas官方文档网址:http://pandas.pydata.org/pandas-docs/stable/api.html
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论