Pandas简介

  Pandas是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护。Pandas最初被作为金融数据分析工具而开发出来,因此,pandas为时间序列分析提供了很好的支持。
  Pandas是基于NumPy构建的,是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具,让以NumPy为中心的应用变得快捷简单。

pandas数据结构

pandas主要有两种数据结构:

  • Series
    Series是一种类似于一维数组的对象,由一组数据以及一组与之相关的数据标签组成。仅由一组数据即可产生最简单的Series
  • DataFrame
    DataFrame是一个表格型的数据,含有一组有序的列,每列可以是不同的值类型。Pandas的dataframe可以存储许多种不同的数据类型,并且每一个坐标轴都有自己的标签。你可以把它想象成一个series的字典项。
      

Series操作

  1. 引入Pandas包,由于Series和DataFrame用的次数非常多,可以将其命名空间单独引入用起来更方便。下面是定义一个Series
In [1]: from pandas import Series,DataFrame
In [2]: import pandas
In [3]: obj = Series([4,7,-5,3])
In [4]: obj
Out[4]: 
0    4
1    7
2   -5
3    3
dtype: int64
  1. 通过Series的values和index属性获取其数组表示形式和索引对象
In [5]: obj.values
Out[5]: array([ 4,  7, -5,  3], dtype=int64)
In [6]: obj[0]
Out[6]: 4
In [7]: obj.index
Out[7]: RangeIndex(start=0, stop=4, step=1)
  1. 自定义索引:Series可以通过自定义索引改变series的索引值,默认会自动创建一个0到N-1的整数型索引。
In [8]: obj2 = Series([4,7,-5,3],index=['d','b','a','c'])
In [9]: obj2
Out[9]: 
d    4
b    7
a   -5
c    3
dtype: int64
In [10]: obj2.index
Out[10]: Index([u'd', u'b', u'a', u'c'], dtype='object')
In [11]: obj2['d']
Out[11]: 4
  1. 通过索引的方式获取单个或一组值
In [15]: obj2[['c','a','d']]
Out[15]: 
c    3
a   -5
d    4
dtype: int64
  1. 通过索引的方式修改单个或一组值
In [16]: obj2['d']=6
In [17]: obj2[['c','a','d']]
Out[17]: 
c    3
a   -5
d    6
dtype: int64
In [18]: obj2
Out[18]: 
d    6
b    7
a   -5
c    3
dtype: int64
  1. NumPy数组运算会保留索引还值之间的链接
In [19]: obj2[obj2>0]
Out[19]: 
d    6
b    7
c    3
dtype: int64

In [20]: obj2*2
Out[20]: 
d    12
b    14
a   -10
c     6
dtype: int64

In [23]: import numpy as np

In [24]: np.exp(obj2)
Out[24]: 
d     403.428793
b    1096.633158
a       0.006738
c      20.085537
  1. Series可以看成一个定长的有序字典,它可以用在许多原本需要字典参数的函数中:
In [25]: 'b' in obj2
Out[25]: True

In [26]: 'e' in obj2
Out[26]: False
  1. Python字典创建Series
In [27]: data = {'Ohio':35000,'Texas':71000,'Oregon':16000,'Utah':5000}

In [28]: obj3 = Series(data)

In [29]: obj3
Out[29]: 
Ohio      35000
Oregon    16000
Texas     71000
Utah       5000
dtype: int64
  1. 查找data中与states中数据匹配的值
In [30]: states = ['California','Ohio','Oregon','Texas']

In [31]: obj4 = Series(data,index=states)

In [32]: obj4
Out[32]: 
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
dtype: float64
  1. Series能在算术运算中会自动对齐不同索引的数据
obj3+obj4
Out[33]: 
California         NaN
Ohio           70000.0
Oregon         32000.0
Texas         142000.0
Utah               NaN
dtype: float64

DataFrame操作

  1. 构建DataFrame的办法很多,通常是直接传入一个由等长列表或NumPy数组组成的字典
In [40]: data = {'state':['Ohio','Ohio','Ohio','Ohio','Ohio'],'year':[2000,2001,2002,2001,2002],'pop':[1.5,1.7,3.6,2.4,2.9]}

In [41]: frame = DataFrame(data)

In [42]: frame
Out[42]: 
   pop state  year
0  1.5  Ohio  2000
1  1.7  Ohio  2001
2  3.6  Ohio  2002
3  2.4  Ohio  2001
4  2.9  Ohio  2002
  1. 通过字典标记的方式或熟悉的方式,可以将DataFrame的列获取为一个Series,返回的series拥有原DataFrame相同的索引,且其name属性已经被相应地设置
In [43]: frame['state']
Out[43]: 
0    Ohio
1    Ohio
2    Ohio
3    Ohio
4    Ohio
Name: state, dtype: object

In [44]: frame.state
Out[44]: 
0    Ohio
1    Ohio
2    Ohio
3    Ohio
4    Ohio
Name: state, dtype: object
  1. 按行获取,可通过loc获取
In [52]: frame2.loc['three']
Out[52]: 
year     2002
state    Ohio
pop       3.6
Name: three, dtype: object
  1. 将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度匹配,如果是一个Series,就会精确匹配DataFrame的索引,空位将被填充缺失值。为不存在的列赋值会创建出新列。
In [54]: val = Series([-1.2,-1.5,-1.7],index=['two','four','five'])

In [55]: frame2['debt']=val

In [56]: frame2
Out[56]: 
       year state  pop  debt
one    2000  Ohio  1.5   NaN
two    2001  Ohio  1.7  -1.2
three  2002  Ohio  3.6   NaN
four   2001  Ohio  2.4  -1.5
five   2002  Ohio  2.9  -1.7
  1. 另一种常见的数据形式是嵌套字典,如果将它传给dataframe,就会被解释为:外层字典的键作为列,内层键作为行索引。
In [58]: pop ={'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7,2002:3.6}}

In [59]: frame3 = DataFrame(pop)

In [60]: frame3
Out[60]: 
      Nevada  Ohio
2000     NaN   1.5
2001     2.4   1.7
2002     2.9   3.6

也可以对结果进行转置

frame3.T
Out[61]: 
        2000  2001  2002
Nevada   NaN   2.4   2.9
Ohio     1.5   1.7   3.6

表中列出了DataFrame构造器所能接收的数据

dataframe loc多重索引某列 dataframe的列索引_数组

  1. 跟Series一样,values属性也会以二维ndarray的形式返回dataframe中的数据
In [62]: frame3.values
Out[62]: 
array([[ nan,  1.5],
       [ 2.4,  1.7],
       [ 2.9,  3.6]])

索引对象

Pandas的索引对象负责管理轴标签和其他元数据。构建Series和DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index。

In [63]: obj = Series(range(3),index=['a','b','c'])
In [64]: index = obj.index

In [65]: index
Out[65]: Index([u'a', u'b', u'c'], dtype='object')

In [66]: index[1:]
Out[66]: Index([u'b', u'c'], dtype='object')

In [67]: index[1]='d'
Traceback (most recent call last):

  File "<ipython-input-67-d3f90986bdb1>", line 1, in <module>
    index[1]='d'

  File "C:\ProgramData\Anaconda2\lib\site-packages\pandas\core\indexes\base.py", line 1620, in __setitem__
    raise TypeError("Index does not support mutable operations")

TypeError: Index does not support mutable operations

index对象是不可修改的,如果对其进行修改,会抛出异常。这样有利于index在多个数据结构之间安全共享

pandas中主要的index对象


说明

Index

最泛化的Index对象,将轴标签表示为一个由Python对象组成的NumPy数组

Int64Index

针对整数的特殊Index

MultiIndex

“层次化”索引现象,表示单个轴上的多层索引,可以看做由元组组成的数组

DatetimeIndex

存储纳秒级时间戳(用NumPy的datetime64类型)

PeriodIndex

针对Period数据(时间间隔)的特殊Index

Index的方法和属性

方法

说明

append

连接另一个Index对象,产生一个新的Index

diff

计算差集,并得到一个Index

intersection

计算交集

union

计算并集

isin

计算一个指示各值是否都包含在参数集合中的布尔型数值

delete

连接另一个Index对象,产生一个新的Index

drop

删除传入的值,并得到新的Index

insert

将元素插入到索引i处,并得到新的Index

is_monottonic

当各元素均大于等于前一个元素时,返回True

is_unique

当Index没有重复值时,返回True

unique

计算Index中唯一值的数组