数据分析之Pandas(二) Series入门

Pandas基本的数据结构是Series和DataFrame。Series是1-D的,DataFrame是2-D的。

首先引入Pandas和Numpy

from pandas import Series, DataFrame
import pandas as pd
import numpy as np

Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。
创建一个Series的最基本方法是:

s = pd.Series(data, index=index)

这里,data指代许多不同的数据类型:

  • a Python dict
  • an ndarray
  • a Python list
  • a scalar value

仅由一组数据即可产生最简单的Series,通过传递一个list来创建一个Series,pandas会默认创建整形索引:

In [2]: obj = Series([4, 7, -5, 3])
In [3]: obj
Out[3]:
0    4
1    7
2   -5
3    3
dtype: int64

我们可以通过Series的values和index属性获取其数组表示形式和索引对象:

In [4]: obj.values
Out[4]: array([ 4,  7, -5,  3], dtype=int64)

In [5]: obj.index
Out[5]: RangeIndex(start=0, stop=4, step=1)

通常,我们希望所创建的Series带有一个可以对各个数据点进行标记的索引:

In [7]: obj2 = Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])

In [8]: obj2
Out[8]:
d    4
b    7
a   -5
c    3
dtype: int64
In [9]: obj2.index
Out[9]: Index([u'd', u'b', u'a', u'c'], dtype='object')

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

In [10]: obj2['a']
Out[10]: -5

In [11]: obj2['d'] = 6

In [12]: obj2[['c', 'a', 'd']]
Out[12]:
c    3
a   -5
d    6

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

In [13]: obj2
Out[13]:
d    6
b    7
a   -5
c    3
dtype: int64

In [14]: obj2[obj2 > 0]
Out[14]:
d    6
b    7
c    3
dtype: int64

In [15]: obj * 2
Out[15]:
0     8
1    14
2   -10
3     6
dtype: int64

In [18]: np.exp(obj2)
Out[18]:
d     403.428793
b    1096.633158
a       0.006738
c      20.085537
dtype: float64

还可以将Series看成是一个定长的有序字典,因为它是索引值到数据值的一个映射。它可以在许多需要字典参数的函数中:

In [19]: 'b' in obj2
Out[19]: True

In [20]: 'e' in obj2
Out[20]: False

如果数据存放在一个python字典中,也可以直接通过这个字典来创建Series:

In [21]: sdata = {'Ohio':3500, 'Texas':7100, 'Oregon':1600, 'Utah':5000}

In [22]: obj3 = Series(sdata)

In [23]: obj3
Out[23]:
Ohio      3500
Oregon    1600
Texas     7100
Utah      5000
dtype: int64

如果只传入一个字典,则结果Series中的索引就是原字典的键(有序排列)。

In [24]: states = ['California', 'Ohio', 'Oregon', 'Texas']

In [25]: obj4 = Series(sdata, index=states)

In [26]: obj4
Out[26]:
California       NaN
Ohio          3500.0
Oregon        1600.0
Texas         7100.0
dtype: float64

在这个例子中,sdata中跟states索引相匹配的那3个值会被找出来并放在相应的位置上,但由于“California”所对应的sdata值找不到,所以其结果就为NaN(即“非数字”(not a number),在pandas中,它用于表示缺失或NA值)。pandas的isnull和notnull函数可用于检测缺失数据:

In [29]: pd.isnull(obj4)
Out[29]:
California     True
Ohio          False
Oregon        False
Texas         False
dtype: bool

In [30]: pd.notnull(obj4)
Out[30]:
California    False
Ohio           True
Oregon         True
Texas          True
dtype: bool

Series也有类似的实例方法:

In [31]: obj4.isnull()
Out[31]:
California     True
Ohio          False
Oregon        False
Texas         False
dtype: bool

In [32]: obj4.notnull()
Out[32]:
California    False
Ohio           True
Oregon         True
Texas          True
dtype: bool

对于许多应用而言,Series最重要的一个功能是:它在算术运算中会自动对齐不同索引的数据。

In [33]: obj3
Out[33]:
Ohio      3500
Oregon    1600
Texas     7100
Utah      5000
dtype: int64

In [34]: obj4
Out[34]:
California       NaN
Ohio          3500.0
Oregon        1600.0
Texas         7100.0
dtype: float64

In [35]: obj3 + obj4
Out[35]:
California        NaN
Ohio           7000.0
Oregon         3200.0
Texas         14200.0
Utah              NaN
dtype: float64

Series对象本身及其索引都有一个name属性,该属性跟pandas其他的关键功能关系非常密切:

In [36]: obj4.name = 'population'

In [37]: obj4.index.name = 'state'

In [38]: obj4
Out[38]:
state
California       NaN
Ohio          3500.0
Oregon        1600.0
Texas         7100.0
Name: population, dtype: float64

Series的索引可以通过赋值的方式就地修改:

In [39]: obj
Out[39]:
0    4
1    7
2   -5
3    3
dtype: int64

In [40]: obj.index = ['Bob', 'Steve', 'Jeff', 'Ryan']

In [41]: obj
Out[41]:
Bob      4
Steve    7
Jeff    -5
Ryan     3
dtype: int64
posted @ 2016-10-20 10:18  晋好林  阅读(15303)  评论(0编辑  收藏  举报
作者:jinhaolin
出处:http://www.cnblogs.com/jinhaolin/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件咨询.