前言
最近刚开始尝试使用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 Series
In [2]:obj = pd.Series([4, 7, -5, 3])
In [3]:obj
Out[3]:
0 4
1 7
2 -5
3 3
dtype: int64
# Dict to Series
In [4]: sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
In [5]: obj2 = pd.Series(sdata)
In [6]: obj2
Out[6]:
Ohio 35000
Oregon 16000
Texas 71000
Utah 5000
dtype: int64
# Array to Series
In [8]: data = np.array([1, 3, 5, 7, 9])
In [9]: sdata2 = pd.Series(data)
In [10]: sdata2
Out[10]:
0 1
1 3
2 5
3 7
4 9
dtype: int32
可以看到pandas在没有给定索引时,会自动生成索引;而像Dict这类给定索引的数据,会沿用原数据的索引。当然我们也可以自己设定索引:
In [12]: obj = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
In [13]: obj
Out[13]:
d 4
b 7
a -5
c 3
dtype: int64
与普通NumPy数组相比,你可以通过索引的方式选取Series中的单个或一组值:
In [15]: obj['a']
Out[15]: -5
In [16]: obj['d'] = 6
In [17]: obj[['c', 'a', 'd']]
Out[17]:
c 3
a -5
d 6
dtype: int64
NumPy数组运算(如根据布尔型数组进行过滤、标量乘法、应用数学函数等)都会保留索引和值之间的链接:
In [18]: obj[obj>0]
Out[18]:
d 6
b 7
c 3
dtype: int64
In [19]: obj*2
Out[19]:
d 12
b 14
a -10
c 6
dtype: int64
In [20]: np.exp(obj)
Out[20]:
d 403.428793
b 1096.633158
a 0.006738
c 20.085537
dtype: 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]: frame
Out[25]:
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
可以看到,DataFrame会自动加上索引(跟Series一样),且全部列会被有序排列。如果指定了列序列,则DataFrame的列就会按照指定顺序进行排列:
In [26]: frame = pd.DataFrame(data, columns=['year', 'state', 'pop'])
In [27]: frame
Out[27]:
year state pop
0 2000 Ohio 1.5
1 2001 Ohio 1.7
2 2002 Ohio 3.6
3 2001 Nevada 2.4
4 2002 Nevada 2.9
通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series:
In [28]: frame['state']
Out[28]:
0 Ohio
1 Ohio
2 Ohio
3 Nevada
4 Nevada
Name: state, dtype: object
具体关于DataFrame如何索引有好几种方法,今后会再开一篇博客详细讲一讲。
关于pandas数据结构的更多内容可以上网查阅或翻阅《利用Python进行数据分析》。