返回介绍

5.3 Pandas

发布于 2024-01-21 22:13:25 字数 5001 浏览 0 评论 0 收藏 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文