本章概要

Python的标准库包括math、random 、datetime 、os等。此外,Python还拥有强大的
第三方库资源,为开发者提供了大量的开发资源。这些库使Python保持活力和高效。
丰富的开源生态系统也是Python成功和流行的原因之一。

借助常用的机器学习库,Python可以解决多种问题,例如科学计算、数据分析、图像
处理等。Python及其生态系统使它成为全世界用户优先选择的开发工具。

本章会介绍常见的用于数据科学任务和机器学习处理的Python库,包括通用的
NumPy、Pandas、Scikitlearn和Matplotlib等,也包含OpenCV 、jieba、wordcloud等专门
库。这些库提供了机器学习任务中经常使用的基本功能。

学习目标

当完成本章的学习后,要求: 

(1)了解常用第三方库的调用方法。
(2)熟悉机器学习库的使用步骤。
(3)掌握NumPy、Pandas的数据处理功能。
(4)掌握Matplotlib的绘图方法。
(5)熟悉Scikitlearn机器学习库的使用。
(6)熟悉其他常用库的使用。
3.
1 
NumPy 

NumPy是NumericalPython的简称,是高性能计算和数据分析的基础包,是Python 
的一个重要扩充库。NumPy支持高维度数组与矩阵运算,也针对数组运算提供了大量


48
的数学函数库。NumPy运算效率极好,是大量机器学习框架的基础库。

NumPy中主要包含一个强大的N 维数组对象ndaray、整合了C/C+
+ 
和
FORTRAN代码的工具包,以及丰富的数学函数库,尤其是实用的线性代数、傅里叶变换
和随机数生成函数。

使用NumPy,开发人员可以很方便地执行数组运算、逻辑运算、傅里叶变换和图形图
像操作。NumPy数组的运算效率优于Python的标准List类型。而且在代码中使用
NumPy可以省去很多烦琐的处理语句,代码更为简洁。

研究人员经常将NumPy和稀疏矩阵运算包SciPy(ScientificPython)配合使用,来
解决矩阵运算问题。将NumPy与SciPy、Matplotlib绘图库相组合是一个流行的计算框
架,这个组合可以作为MATLAB的替代方案。


3.1.1 
ndaray对象
NumPy的强大功能主要基于底层的一个ndaray结构,其可以生成N维数组对象。
视频讲解ndaray对象是一系列同类型数据的集合,下标索引从0开始,是一个用于存放同类
型元素的多维数组。ndaray中的每个元素在内存中都具有相同大小的存储区域。
与Python中的其他容器对象一样,ndaray可以通过对数组建立索引或切片来访问
数组内容,也可以使用ndaray的方法和属性来访问和修改ndaray的内容。

1.ndaray的内部结构
相对标准的数组,ndaray本质上是一个数据结构。如图3.ndaray内部主要

1所示,
由以下内容构成。


图3.y的数据结构

1ndara

(1)数组形状shape:是一个表示数组各维大小的整数元组。
(2)数据类型dtype:是一个描述数组的类型对象。对象类型为NumPy内置的24 
种数组标量类型中的一种。
(3)数组数据data:是一个指向内存中数据的指针。
(4)跨度strides:一个元组,是当前维度的宽,表示当前维度移动到下一个位置需要
跨越的字节数。跨度可以是负数,这样会使数组在内存中后向移动。
(5)数组顺序order:访问数组元素的主顺序,如“C”为行主序,“F”为列主序等。

49 
2.创建ndarray 
在NumPy模块中,提供了ndarray()和array()两个函数,都可以用来建立一个
ndarray。其中ndarray()函数属于底层的方法,一般情况下,建立数组使用的是更为便捷
的array()函数,其一般格式如下。 
numpy.array(object, dtype = None, copy = True, order = None, subok = False, 
ndmin = 0) 
主要参数: 
object:数组或嵌套的数列。
dtype:数组元素的数据类型,可选。
order:创建数组的样式,C为行方向,F为列方向,A 为任意方向(默认)。
ndmin:指定所生成数组应具有的最小维度。
【例3.1】 建立一个一维ndarray数组。 
import numpy as np 
a = np.array([1,2,3]) 
print(a) 
【例3.2】 创建二维数组。 
import numpy as np 
a = np.array([[1,2], [3,4]]) 
print(a) 
【例3.3】 使用ndmin参数设置数组的最小维度。 
import numpy as np 
a = np.array([1,2,3,4,5], ndmin=2) 
print(a) 
【例3.4】 使用dtype参数设置数组类型为复数。 
import numpy as np 
a = np.array([1,2,3], dtype = np.complex) 
print(a) 
在内存中,ndarray对象的存放形式是连续的一维数列。在访问时,通过索引获取内
存块中的对应元素位置。内存块以行顺序(C样式)或列顺序(F样式,即FORTRAN 或
MATLAB风格)来保存元素。
NumPy还提供了asarray()函数,可以将其他类型的结构数据转换为ndarray。
3.1.2 NumPy数据类型
NumPy内置了24种数组标量(ArrayScaler)类型,也支持Python的基本数据类型, 
某种程度上可以和C 语言的数据类型相对应,如表3.1所示。

50 
表3.1 NumPy的基本数据类型
名 称描 述
bool_ 布尔型,True或False 
int8 有符号字节类型,范围为-128~127 
int16 有符号16位整数,范围为-32768~32767 
int32 有符号32位整数,范围为-231~231-1 
int64 有符号64位整数,范围为-263~263-1 
uint8 无符号字节类型,范围为0~255 
uint16 无符号16位整数,范围为0~65535 
uint32 无符号32位整数,范围为0~232-1 
uint64 无符号64位整数,范围为0~264-1 
float_ 64位浮点数,同float64 
float16 16位浮点数
float32 32位浮点数
float64 64位(双精度)浮点数,同float_ 
complex_ 128位复数* ,同complex128 
complex64 64位复数
complex128 128位复数,同complex_ 
*复数:形如z=a+bi(a,b均为实数)的数称为复数,其中,a称为实部,b称为虚部,i称为虚数单位(i表示-1 
的平方根)。
当虚部b=0时,复数z是实数; 
当虚部b!=0且实部a=0时,复数z是纯虚数。
对于每种数据类型,NumPy还提供了同名的类型函数,例如float16()、int32()等,可
以用来创建该类型的数据对象,也可以用来转换数据对象的数据类型。
【例3.5】 NumPy数据类型的使用。 
import numpy as np 
x=np.float32(5) 
print('x 为:',x) 
print('x 对象的data 属性: ',x.data) 
print('x 对象的size 属性:',x.size) 
print('x 对象的维数:',x.ndim) 
y=np.bool_(x) 
print('转换为bool 类型的x 为:',y) 
z=np.float16(y) 
print('True 值转换为float16 类型为:',z)

51 
运行结果为: 
x 为: 5.0 
x 对象的data 属性: <memory at 0x000002D11F41FDC8> 
x 对象的size 属性: 1 
x 对象的维数: 0 
转换为bool 类型的x 为: True 
True 值转换为float16 类型为: 1.0 
上面的函数能够设置、修改对象数据类型。不过通常情况下,建议使用NumPy中的
dtype对象指定数据类型。
1.数据类型对象(dtype) 
NumPy中的dtype(datatypeobject)是由numpy.dtype类产生的数据类型对象,其
作用是描述数组元素对应的内存区域的各部分的使用。其内部结构包括数据类型、数据
的字节数、各组成部分的顺序、各字段的名称等。
构造dtype对象的语法如下。 
numpy.dtype(object, align, copy) 
主要参数如下。
object:要转换为dtype对象的数据对象。
align:如果为True,则填充字段使其类似C的结构体。
copy:指明是否复制dtype对象。如果为False,则是对内置数据类型对象的引用。
如果使用dtype对象设置数据类型,那么可以对例3.5做如下修改。
【例3.6】 使用dtype对象设置数据类型。 
import numpy as np 
x=np.array(5,dtype="float32") 
print('x 为:',x) 
print('x 对象的data 属性: ',x.data) 
print('x 对象的size 属性:',x.size) 
print('x 对象的维数:',x.ndim) 
y=np.array(x,dtype="bool_") 
print('转换为bool 类型的x 为:',y) 
z=np.array(y,dtype="float16") 
print('True 值转换为float16 类型为:',z) 
运行结果如下。 
x 为: 5.0 
x 对象的data 属性: <memory at 0x000002D11F552588> 
x 对象的size 属性: 1 
x 对象的维数: 0 
转换为bool 类型的x 为: True

52 
True 值转换为float16 类型为: 1.0 
有些数据类型有简写,例如int8,int16,int32,int64四种数据类型可以使用字符串
i'1',i'2',i'4',i'8'简写代替。
例如,使用“i4”字符串代替int32类型。 
import numpy as np 
dt = np.dtype('i4') 
print(dt) 
2.使用astype()修改数据类型
在数组建立之后,也可以使用NumPy中数组附带的astype()方法修改其数据类型, 
格式如下。 
array.astype(dtype,order='K',casting='unsafe',subok=True,copy=True) 
例如,将y设置成float32类型,可以用: 
y=y.astype("float32") 
或者 
y=y.astype(np.float32) 
另外,使用NumPy数组的astype()方法还可以把Python的数据类型映射给dtype 
类型,如语句x=x.astype(float)与x=x.astype(np.float)运行结果相同。
表3.2是常用Python对象与NumPy的dtype对象的对应表,其他数据类型没有与
Python等效的数据类型。
表3.2 Python对象与dtype对象对应关系表
Python对象dtype对象
int numpy.int_ 
bool numpy.bool_ 
float numpy.float_ 
complex numpy.complex_ 
【扩展】由于Pandas是基于NumPy数组的,所以也能用astype()对DataFrame的字
段进行类型转换。
【例3.7】 使用astype()转换DataFrame。 
import pandas as pd 
df = pd.DataFrame([{'qty':'3', 'num':'50'}, {'qty':'7', 'num':'20'}]) 
print(df.dtypes) 
print('--------------') 
df['qty'] = df['qty'].astype('int')

53 
df['num'] = df['num'].astype('float64') 
print(df.dtypes) 
可以看到,两个列的数据类型由初始的object变成了float64和int32。 
DataFrame 的dtypes: 
Num object 
Qty object 
dtype: object 
-------------------------- 
astype()转换后的dtypes: 
Num float64 
Qty int32 
dtype: object 
3.1.3 NumPy数组属性
1.常用术语 
(1)轴(Axis):每个线性数组称为一个轴,轴即数组的维度(Dimensions)。例如,将
二维数组看作一维数组,此一维数组中每个元素又是一个一维数组,则每个一维数组是
NumPy中的一个轴。第一个轴相当于底层数组,第二个轴是底层数组中的数组。
(2)秩(Rank):秩描述NumPy数组的维数,即轴的数量。一维数组的秩为1,二维
数组的秩为2,以此类推。
例如,[0,1,2]是一维数组,只有一个轴,其秩为1,轴长度为3;[[0,1,2],[3,4,5]]是
一个二维数组,数组的秩为2,具有两个轴,其中第一个轴(维度)的长度为2,第二个轴(维
度)的长度为3。
在使用的时候可以声明axis。如果axis=0,表示按第0轴方向操作,即对每列进行
操作;如果axis=1,表示按第1轴方向操作,即对每行进行操作。
【例3.8】 使用axis参数设置当前轴。 
import numpy as np 
arr=np.array([[0,1,2],[3,4,5]]) 
print(arr) 
print(arr.sum(axis=0)) 
print(arr.sum(axis=1)) 
运行结果如下。
在这个程序中,首先使用arr.sum(axis=0)进行垂直(列)方向的求和计算,然后使用
arr.sum(axis=1)沿行方向计算。

54 
2.基本属性
NumPy的ndarray数组具有属性,可以获得数组的信息,常见属性见表3.3。
表3.3 常见的ndarray数组属性
属 性说 明
ndarray.ndim 秩,轴的数量
ndarray.shape 数组的维度
ndarray.size 数组元素的总个数
ndarray.dtype 数组元素类型
ndarray.itemsize 每个元素的大小(B) 
ndarray.data 实际数组元素 
1)ndarray.ndim 
在NumPy中ndarray.ndim 返回这个数组的维数,等于秩。reshape()函数可以将数
组变形重构,调整数组各维度的大小。
reshape()的格式为: 
numpy.reshape(a,newshape,order='C') 
【例3.9】 使用reshape()函数调整数组形状。 
import numpy as np 
arr=np.array([0, 1, 2, 3, 4, 5, 6, 7]) 
#显示数组arr 的rank 
print('秩为:',arr.ndim) 
arr3D = arr.reshape(2,2,2) 
print(arr3D) 
print ('秩为:',arr3D.ndim) 
显示结果如下。
思考:reshape()函数是否修改原arr数组? 请使用print()函数查看。
2)ndarray.shape 
ndarray.shape代表数组的维度,返回值为一个元组。这个元组的长度就是ndim 属
性(秩)。另外,ndarray.shape也可以用于调整数组大小。

55 
【例3.10】 显示数组的维度。 
import numpy as np 
a = np.array([[1,2,3],[4,5,6]]) 
print (a.shape) 
【例3.11】 调整数组大小。 
import numpy as np 
a = np.array([[1,2,3],[4,5,6]]) 
a.shape = (3,2) 
print (a) 
3)数据类型dtype 
数据类型对象dtype是一个特殊的对象,包含ndarray将一块内存解析成特定数据
类型所必需的信息。
【例3.12】 创建dtype数据类型对象。 
myArr=np.array([1,2,3],dtype=np.float64) 
myArr.dtype 
查看运行结果: 
3.1.4 其他创建数组的方式
ndarray数组可以使用array()函数来构造。此外,还有其他几种方式可以用来创建
特殊的数组。
1.numpy.empty() 
NumPy的empty()函数能创建一个指定形状、数据类型的空数组。这个数组没有经
过初始化,其内容为空。表3.4为创建空数组的参数。
格式: 
numpy.empty(shape, dtype = float, order = 'C') 
表3.4 创建空数组的参数
参数描 述
shape 数组形状
dtype 数据类型,可选
order 有"C"和"F"两个选项,分别代表行优先和列优先,表示在计算机内存中存储元素的顺序 
【例3.13】 创建一个空数组。 
import numpy as np

56 
x = np.empty([3,2], dtype = int) 
print(x) 
运行后得到的数组元素值是不确定的,因为所用空间未初始化。
2.numpy.zeros() 
有时需要创建全0填充的数组,此时可以使用NumPy的zeros()函数,其参数见表3.5。
格式: 
numpy.zeros(shape, dtype = float, order = 'C') 
表3.5 创建zeros数组的参数
参数描 述
shape 数组形状
dtype 数据类型,可选
order 'C' 用于C风格———行为主的数组,或者'F' 用于FORTRAN风格———列为主的数组 
【例3.14】 创建一个全0数组。 
import numpy as np 
#默认为浮点数
x = np.zeros(5) 
print(x) 
#设置类型为整数
y = np.zeros((5,), dtype = np.int) 
print(y) 
#自定义类型
z = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')]) 
print(z) 
3.numpy.ones() 
有时需要一个以1填充的数组,这时可以使用NumPy专门提供的ones()函数来
创建。格
式: 
numpy.ones(shape, dtype=None, order='C') 
【例3.15】 建立一个全1数组。 
import numpy as np 
#默认为浮点数
x = np.ones(5) 
print(x) 
#自定义类型

57 
x = np.ones([2,2], dtype = int) 
print(x) 
4.产生数列的函数
在进行科学运算时,经常用到基本的简单数列,如1~50等。Python中提供了range() 
函数。NumPy中也有类似的函数,如arange()、linspace()函数等。
1)range()函数
Python内置的range()函数通过指定开始值、终值和步长可以创建一个一维数组。
注意,生成的数组不包括终值。
格式: 
range(start, stop [,step]) 
所生成的数组从start开始,到stop-1结束,间隔(步长)为step。默认情况下从0 
开始。step默认为1,需要是整数。
例如: 
arr1=range(0,5,1) 
2)arange()函数
NumPy的arange()函数功能与range()函数类似,在start开始到stop的范围内,生
成一个ndarray数组。
格式: 
arange([start,] stop [, step,], dtype=None) 
【例3.16】 生成3~9的步长为0.2的数组。 
import numpy as np 
arr2=np.arange(3,9,0.2) 
arr2 
运行结果如下。
3)linspace()函数
格式: 
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 
其中,start为序列的起始值,stop为结束值,num 是生成的样本数。
【例3.17】 生成1~5中的10个数。 
import numpy as np

58 
arr3=np.linspace(1, 5, 10) 
arr3 
运行结果如下。
5.使用随机函数创建数组
除了简单的顺序数列,NumPy还在random 子模块中提供了随机函数,常见的随机
函数见表3.6。
表3.6 常用的NumPy随机函数
函 数描 述
rand(d0,d1,…,dn) 随机产生指定维度的浮点数组
randint(low[,high,size,dtype]) 随机产生[low,high]的整数
random([size]) 随机产生[0.0,1.0)的浮点数
uniform(start,end,size) 从[start,end)均匀分布的数据中随机抽取一组浮点数
normal(loc,scale,size) 基于给定的均值和方差,随机产生一组正态分布的浮点数 
*正态分布(NormalDistribution):又称高斯分布,是许多统计方法的理论基础。分
布图形左右对称。正态分布的参数包括均值和标准差。同样的均值情况下,标准差越大, 
曲线越平阔;标准差越小,曲线越狭窄。使用np.random.normal()函数可以生成服从正
态分布的数据。
【例3.18】 创建随机数组。 
#生成2 行3 列的随机浮点数组
np.random.rand(2,3) 
#生成2 行2 列的10 以内的随机整数数组
np.random.randint(0,10,(2,2)) 
#生成2 行3 列的[1,2)的随机浮点数组
np.random.uniform(1,2,(2,3)) 
6.其他数据结构转换成ndarray 
NumPy中可以通过array()函数,将Python中常见的数值序列,如List(列表)和
Tuple(元组)等,转换为ndarray数组。
【例3.19】 将list类型转换成ndarray。 
import numpy as np 
#List

59 
data = [[2000, 'Ohino', 1.5], 
[2002, 'Ohino', 3.6], 
[2002, 'Nevada', 2.9]] 
print(type(data)) 
#List to array 
ndarr = np.array(data) 
print(type(ndarr)) 
运行结果如下。
3.1.5 切片、迭代和索引
切片是指取数据序列对象的一部分的操作,前面介绍过字符串、列表、元组都支持切
片语法。ndarray数组与其他数据序列类似,也可以进行索引、切片和迭代。
1.切片
对ndarray进行切片操作与一维数组相同,用索引标记切片的起始和终止位置即可。
因为ndarray可以是多维数组,在进行切片时,通常需要设定每个维度上的切片位置。
NumPy还提供了一个copy()方法,可以根据现有的ndarray数组创建新的ndarray 
数组。使用copy()方法与切片,可以用原数组的一部分生成新数组。
【例3.20】 创建二维ndarray的切片。 
import numpy as np 
#创建一个4 行6 列的二维数组
arr = np.arange(24).reshape(4,6) 
print('arr =\n',arr) 
#截取第2 行到最后一行、第1 列到第3 列构成的ndarray 
arr1 = arr[1:, :3] 
print('B = \n',arr1) 
运行结果如下。
视频讲解

60 
【例3.21】 使用numpy.copy()函数对ndarray数组进行切片复制。 
import numpy as np 
#创建一个4 行6 列的二维数组
arr = np.arange(24).reshape(4, 6) 
print('arr =\n',arr) 
#切片复制arr 的第2 行到第4 行、第1 列到第3 列
arr2 = np.copy(arr[1:4, 0:3]) 
print('A = \n',arr2) 
#复制arr2 到arr3 
arr3 = arr2.copy() 
print('B = \n',arr3) 
2.迭代
与其他数据序列类似,ndarray也可以通过for循环实现迭代。当维数多于一维时, 
迭代操作使用嵌套的for循环。
迭代时,通常按照第一条轴(默认为行)对二维数组进行扫描。如果需要按其他维度
迭代,可以使用apply_along_axis(func,axis,arr)函数指定当前处理的轴。
此外,NumPy还包含一个循环迭代器类numpy.nditer,所生成的迭代器(Iterator)对
象是一个根据位置进行遍历的对象。这是一个有效的多维迭代器对象,与Python内置
的iter()函数类似,每个数组元素可使用迭代器对象来访问,从而很方便地对数组进行
遍历。
【例3.22】 使用嵌套for循环对ndarray数组进行迭代遍历。 
import numpy as np 
a = np.arange(0,60,5) 
a = a.reshape(3,4) 
for xline in a: 
for yitem in xline: 
print(yitem,end=' ') 
运行结果如下。 
0 5 10 15 20 25 30 35 40 45 50 55 
【例3.23】 使用nditer对象对ndarray数组进行迭代。 
import numpy as np 
a = np.arange(0,60,5) 
a = a.reshape(3,4) 
print(a) 
print(np.nditer(a)) 
for x in np.nditer(a): 
print(x,end=' ')

61 
运行结果如下。 
[[ 0 5 10 15] 
[20 25 30 35] 
[40 45 50 55]] 
<numpy.nditer object at 0x000002D121467CB0> 
0 5 10 15 20 25 30 35 40 45 50 55 
迭代的顺序与数组的内容布局相匹配,不受数据排序的影响。例如,对上述数组的转
置进行迭代,可以发现,虽然数据的显示顺序发生了变化,但不影响迭代的顺序。
【例3.24】 转置数组的迭代。 
import numpy as np 
a = np.arange(0,60,5) 
a = a.reshape(3,4) 
print(a) 
b = a.T 
print(b) 
print('Iterator in a:') 
for x in np.nditer(a): 
print(x,end='|') 
print('\nIterator in a.T:') 
for y in np.nditer(b): 
print(y,end='|') 
运行结果如下。
如果需要特定的顺序,可以设置显式参数来强制nditer对象使用某种顺序,如例3.25。
【例3.25】 数组的访问顺序。 
import numpy as np 
a = np.arange(0,60,5) 
a = a.reshape(3,4) 
print(a) 
print('C 风格的顺序:') 
for x in np.nditer(a, order = 'C'): 
print(x,end='|')

62 
print( '\n' ) 
print( 'F 风格的顺序:') 
for y in np.nditer(a, order = 'F'): 
print(y,end='|') 
运行结果如下。
3.1.6 NumPy计算
NumPy中的ndarray可以直接进行基本运算,包括条件运算、统计运算,以及基本数
组运算等。
1.条件运算
NumPy中的条件运算除了常见的比较大小运算,还可以使用where()函数实现查找
操作。where()函数格式如下。 
where(condition, x if true, y if false) 
该函数根据条件表达式condition的值返回特定的数组。当条件为真时返回x数组, 
条件为假时返回y数组。
【例3.26】 简单条件运算。 
import numpy as np 
stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]]) 
result=[stus_score> 80] 
print(result) 
运行结果如下。
【例3.27】 用np.where()函数实现数据筛选。 
import numpy as np 
num = np.random.normal(0, 1, (3,4)) 
print(num)

63 
num[num<0.5]=0 
print(num) 
print(np.where(num>0.5,1,0)) 
运行结果如下。
2.统计计算
NumPy提供了丰富的统计函数,常用统计函数如表3.7所示。
表3.7 NumPy的常用统计函数
函 数描 述
argmax() 求最大值的索引
argmin() 求最小值的索引
cumsum() 从第一个元素开始累加各元素
max() 求最大值
mean() 求算术平均值
min() 求最小值
std() 求数组元素沿给定轴的标准偏差
sum() 求和 
【例3.28】 ndarray的统计计算。 
import numpy as np 
stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]]) 
#求每列的最大值(0 表示列) 
result = np.max(stus_score, axis=0) 
print(result) 
#求每行的最大值(1 表示行) 
result = np.max(stus_score, axis=1) 
print(result) 
#求每行的最小值(1 表示行) 
result = np.min(stus_score, axis=1) 
print(result) 
#求每列的平均值(0 表示列)

64 
result = np.mean(stus_score, axis=0) 
print(result) 
运行结果如下。
3.2 Pandas 
Pandas(Python Data AnalysisLibrary)是Python 的一个数据分析包,是基于
NumPy的一种工具,是为了解决数据分析任务而创建的。
Pandas使用强大的数据结构提供高性能的数据操作和分析工具。模块提供了大量
的能便捷处理数据的函数、方法和模型,还包括操作大型数据集的工具,从而能够高效分
析数据。
Pandas主要处理以下三种数据结构。
(1)Series:一维数组,与NumPy中一维的ndarray类似。数据结构接近Python中
的List列表,数据元素可以是不同的数据类型。
(2)DataFrame:二维数据结构。DataFrame可以理解成Series的容器,其内部的每
项元素都可以看作一个Series。DataFrame是重要的数据结构,在机器学习中经常使用。
(3)Panel:三维数组,可以理解为DataFrame的容器,其内部的每项元素都可以看
作一个DataFrame。
这些数据结构都构建在NumPy数组的基础之上,运算速度很快。
3.2.1 Series数据结构
Series是一种类似于一维数组的对象,它由一组数据以及一组与之相关的数据标签
(即索引)组成,数据可以是任何NumPy数据类型(整数、字符串、浮点数、Python 对
象等)。
1.创建Series对象
创建Series对象可以使用函数pd.Series(data,index),其中,data表示数据值,index 
是索引,默认情况下会自动创建一个0~N-1(N 为数据的长度)的整数型索引。访问
Series对象的成员可以使用类似ndarray数组的切片访问方法,也可以按索引名访问。
【例3.29】 创建一个Series对象。 
import pandas as pd 
s = pd.Series([1,3,5,9,6,8]) 
print(s)

65 
【例3.30】 为一个地理位置数据创建Series对象。 
import pandas as pd 
#使用列表创建,索引值为默认值
print('-------- 列表创建Series ----------') 
s1=pd.Series([1,1,1,1,1]) 
print(s1) 
print('-------- 字典创建Series ----------') 
#使用字典创建,索引值为字典的key 值
s2=pd.Series({'Longitude':39,'Latitude':116,'Temperature':23}) 
print('First value in s2:',s2['Longitude']) 
print('-------- 用序列作Series 索引----------') 
#使用由range()函数生成的迭代序列设置索引值
s3=pd.Series([3.4,0.8,2.1,0.3,1.5],range(5,10)) 
print('First value in s3:',s3[5]) 
运行结果如下。 
-------- 列表创建Series ---------- 
0 1 
1 1 
2 1 
3 1 
4 1 
dtype: int64 
-------- 字典创建Series ---------- 
First value in s2: 39 
-------- 用序列作Series 索引---------- 
First value in s3: 3.4 
2.访问Series数据对象
1)修改数据
可以通过赋值操作直接修改Series对象成员的值,还可以为多个对象成员批量修改
数据。
【例3.31】 对例3.30创建的s2,将温度增加2℃,设置城市为Beijing。 
#温度增加2℃,设置城市为Beijing 
s2["City"]="Beijing" 
s2['Temperature']+=2 
s2 
运行结果如下。 
Longitude 39 
Latitude 116

66 
Temperature 25 
City Beijing 
dtype: object 
2)按条件表达式筛选数据
【例3.32】 找出s3中大于2的数据。 
s3[s3>2] 
输出结果如下。 
5 3.4 
7 2.1 
dtype: float64 
3)增加对象成员
两个Series对象可以通过append()函数进行拼接,从而产生一个新的Series对象。
进行拼接操作时,原来的Series对象内容保持不变。
【例3.33】 为s2添加一项湿度数据。 
stiny=pd.Series({'humidity':84}) 
s4=s2.append(stiny) 
print('-------原Series:-------\n',s2) 
print('-------新Series:-------\n',s4) 
输出结果如下。 
-------原Series:------- 
Longitude 39 
Latitude 116 
Temperature 25 
City Beijing 
dtype: object 
-------新Series:------- 
Longitude 39 
Latitude 116 
Temperature 25 
City Beijing 
humidity 84 
dtype: object 
可以看到,合并操作不影响原Series。结果中原s2数据没有变化,新创建的s4对象
接收了合并后的新数据。
4)删除对象成员
可以通过drop()函数删除对象成员,可以删除一个或多个对象成员。与append()函
数一样,drop()函数也不改变原对象的内容,而会返回一个新的Series对象。