要使用pandas,你首先就得熟悉它的两个主要数据结构:Series和DataFrame。虽然它们并不能解决所有问题,但它们为大多数应用提供了一种可靠的、易于使用的基础。
一、Series
Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成
Series的字符串表现形式为:索引在左边,值在右边。由于我们没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引。
通过Series 的values和index属性获取其数组表示形式和索引对象:
创建series
- 通过指定index索引创建:
- 通过字典创建:
如果只传入一个字典,则结果Series中的索引就是原字典的键(有序排列)。你可以传入排好序的字典的键以改变顺序:
在这个例子中,sdata中跟states索引相匹配的那3个值会被找出来并放到相应的位置上,但由于"California"所对应的sdata值找不到,所以其结果就为NaN(即“非数字”(not a number),在pandas中,它用于表示缺失或NA值)。因为‘Utah’不在states中,它被从结果中除去。
我将使用缺失(missing)或NA表示缺失数据。pandas的isnull和notnull函数可用于检测缺失数据:
Series也有类似的实例方法:
obj4.isnull()
series的索引
使用NumPy函数或类似NumPy的运算(如根据布尔型数组进行过滤、标量乘法、应用数学函数等)都会保留索引值的链接:
对于许多应用而言,Series最重要的一个功能是,它会根据运算的索引标签自动对齐数据:
数据对齐功能将在后面详细讲解。如果你使用过数据库,你可以认为是类似join的操作。
Series的索引可以通过赋值的方式就地修改:
Series对象本身及其索引都有一个name属性,该属性跟pandas其他的关键功能关系非常密切:
二、DataFrame
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。
DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。
DataFrame中的数据是以一个或多个二维块存放的(而不是列表、字典或别的一维数据结构)
笔记:虽然DataFrame是以二维结构保存数据的,但你仍然可以轻松地将其表示为更高维度的数据(层次化索引的表格型结构,这是pandas中许多高级数据处理功能的关键要素,我们会在第8章讨论这个问题)。
创建DataFrame
普通字典创建
最常用的一种是直接传入一个由等长列表或NumPy数组组成的字典:
结果DataFrame会自动加上索引(跟Series一样),且全部列会被有序排列:
如果指定了列序列,则DataFrame的列就会按照指定顺序进行排列:
如果传入的列在数据中找不到,就会在结果中产生缺失值:
嵌套字典创建
另一种常见的数据形式是嵌套字典:
如果嵌套字典传给DataFrame,pandas就会被解释为:外层字典的键作为列,内层键则作为行索引:
内层字典的键会被合并、排序以形成最终的索引。如果明确指定了索引,则不会这样:
由Series组成的字典差不多也是一样的用法:
表5-1列出了DataFrame构造函数所能接受的各种数据。
获取列/行数据(series)
通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series:
frame2[column]适用于任何列的名,但是frame2.column只有在列名是一个合理的Python变量名时才适用。
注意,返回的Series拥有原DataFrame相同的索引,且其name属性也已经被相应地设置好了(默认设置为列索引名称)。
行也可以通过位置或名称的方式进行获取,比如用loc属性(稍后将对此进行详细讲解):
修改列数据
列可以通过赋值的方式进行修改。
例如,我们可以给那个空的"debt"列赋上一个标量值或一组值:
将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配。如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有的空位都将被填上缺失值:
为不存在的列赋值会创建出一个新列
注意:不能用frame2.eastern创建新的列。
del方法可以用来删除这列:
注意:通过索引方式返回的列只是相应数据的视图而已,并不是副本。因此,对返回的Series所做的任何就地修改全都会反映到源DataFrame上。通过Series的copy方法即可指定复制列。
如果设置了DataFrame的index和columns的name属性,则这些信息也会被显示出来:
跟Series一样,values属性也会以二维ndarray的形式返回DataFrame中的数据:
如果DataFrame各列的数据类型不同,则值数组的dtype就会选用能兼容所有列的数据类型:
三、索引对象
pandas的索引对象负责管理轴标签和其他元数据(比如轴名称等)。构建Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index:
Index对象是不可变的,因此用户不能对其进行修改
不可变可以使Index对象在多个数据结构之间安全共享:
注意:虽然用户不需要经常使用Index的功能,但是因为一些操作会生成包含被索引化的数据,理解它们的工作原理是很重要的。
除了类似于数组,Index的功能也类似一个固定大小的集合,与python的集合不同,pandas的Index可以包含重复的标签,选择重复的标签,会显示所有的结果。
每个索引都有一些方法和属性,它们可用于设置逻辑并回答有关该索引所包含的数据的常见问题。表5-2列出了这些函数。