python数据处理工具包——pandas简介(如何构建数据结构篇)

来源:互联网 发布:word for mac如何使用 编辑:程序博客网 时间:2024/05/17 21:59

前言

最近刚开始尝试使用python分析数据,网上很多人都推荐使用pandas,于是自己也去试了试,觉得其功能甚是强大,特别是对于时间序列的处理有很多内置的函数用起来非常方便。这里先简单地介绍一下pandas的数据结构,主要内容来自于《利用Python进行数据分析》。

简单介绍

pandas是基于NumPy构建的,纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。一般通过如下方式引用:

import pandas as pd

所以很多时候都简写为pd了。

pandas的数据结构

在pandas中的数据结构有Series、DataFrame、Panel等。其中Series和DataFrame是最主要的两种数据结构,它们为大多数应用提供了一种可靠的、易于使用的基础。

Series

Series是一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近,其区别是:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。Series可以通过List、Dict或Array等数据结构直接生成。如:

# List to SeriesIn [2]:obj = pd.Series([4, 7, -5, 3])In [3]:objOut[3]: 0    41    72   -53    3dtype: int64# Dict to SeriesIn [4]: sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}In [5]: obj2 = pd.Series(sdata)In [6]: obj2Out[6]: Ohio      35000Oregon    16000Texas     71000Utah       5000dtype: int64# Array to SeriesIn [8]: data = np.array([1, 3, 5, 7, 9])In [9]: sdata2 = pd.Series(data)In [10]: sdata2Out[10]: 0    11    32    53    74    9dtype: int32

可以看到pandas在没有给定索引时,会自动生成索引;而像Dict这类给定索引的数据,会沿用原数据的索引。当然我们也可以自己设定索引:

In [12]: obj = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])In [13]: objOut[13]: d    4b    7a   -5c    3dtype: int64

与普通NumPy数组相比,你可以通过索引的方式选取Series中的单个或一组值:

In [15]: obj['a']Out[15]: -5In [16]: obj['d'] = 6In [17]: obj[['c', 'a', 'd']]Out[17]: c    3a   -5d    6dtype: int64

NumPy数组运算(如根据布尔型数组进行过滤、标量乘法、应用数学函数等)都会保留索引和值之间的链接:

In [18]: obj[obj>0]Out[18]: d    6b    7c    3dtype: int64In [19]: obj*2Out[19]: d    12b    14a   -10c     6dtype: int64In [20]: np.exp(obj)Out[20]: d     403.428793b    1096.633158a       0.006738c      20.085537dtype: float64

DataFrame

如果说Series是一个一维数组型结构,那么DataFrame就是个表格型数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。跟其他类似的数据结构相比(如R的data.frame),DataFrame中面向行和面向列的操作基本上是平衡的。其实,DataFrame中的数据是以一个或多个二维块存放的(而不是列表、字典或别的一维数据结构)。
构建DataFrame的办法有很多,最常用的一种是直接传入一个由等长列表或NumPy数组组成的字典:

In [24]: data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],     ...:        'year': [2000, 2001, 2002, 2001, 2002],     ...:        'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}    ...: frame = pd.DataFrame(data)In [25]: frameOut[25]:    pop   state  year0  1.5    Ohio  20001  1.7    Ohio  20012  3.6    Ohio  20023  2.4  Nevada  20014  2.9  Nevada  2002

可以看到,DataFrame会自动加上索引(跟Series一样),且全部列会被有序排列。如果指定了列序列,则DataFrame的列就会按照指定顺序进行排列:

In [26]: frame = pd.DataFrame(data, columns=['year', 'state', 'pop'])In [27]: frameOut[27]:    year   state  pop0  2000    Ohio  1.51  2001    Ohio  1.72  2002    Ohio  3.63  2001  Nevada  2.44  2002  Nevada  2.9

通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series:

In [28]: frame['state']Out[28]: 0      Ohio1      Ohio2      Ohio3    Nevada4    NevadaName: state, dtype: object

具体关于DataFrame如何索引有好几种方法,今后会再开一篇博客详细讲一讲。
关于pandas数据结构的更多内容可以上网查阅或翻阅《利用Python进行数据分析》。

0 0
原创粉丝点击