要使用pandas,首先要熟悉他的两个主要的数据结构:Series和DataFrame。
一、Series
Series 是一种类似于一维数组的对象,由一组数据(各种numpy数据类型)以及一组与之相关的数据标签(即索引)组成。
仅由一组数据即可产生最简单的Series:
>>> from pandas import Series,DataFrame
>>> import pandas as pd
>>> obj=pd.Series([4,7,-5,3])
>>> obj
0 4
1 7
2 -5
3 3
dtype: int64
左边是索引,右边是值,这样看起来Series好像更像dict或map这一类具有键值对的结构。
>>> obj.values #值
array([ 4, 7, -5, 3], dtype=int64)
>>> obj.index #索引对象
RangeIndex(start=0, stop=4, step=1)
分别获得值对象与索引对象。
手动指定索引
>>> obj1=Series([4,7,-5,3],index=['a','b','d','c'])
>>> obj1
a 4
b 7
d -5
c 3
dtype: int64
通过索引取值:
>>> obj1['a']
4
>>> obj1[['a','d','b']] #获取多个值
a 4
d -5
b 7
dtype: int64
数组运算:
>>> obj1[obj1>0]
a 4
b 7
c 3
dtype: int64
>>> obj1*2
a 8
b 14
d -10
c 6
dtype: int64
既然Series的结构很像dict,自然也可以通过一个dict去创建Series
>>> sdata={'ohio':3500,'Texas':710,'Utah':500}
>>> obj2=Series(sdata)
>>> obj2
Texas 710
Utah 500
ohio 3500
dtype: int64
name属性,Series对象本身及其索引都有一个name属性
>>> obj2.index.name='state'
>>> obj2.name='population'
>>> obj2
state #索引名
Texas 710
Utah 500
ohio 3500
Name: population, dtype: int64 #Series名
二.DataFrame
DataFrame是一个表格型的数据结构,含有一组有序的列,每列可以是不同的值类型(数值,字符串,布尔值等)。DataFrame既有行索引也有列索引,可以被看做是由Series组成的字典。DataFrame中的数据是以一个或多个二维块存放的。
构建DataFrame
>>> 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=DataFrame(data)
>>> frame
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(data,columns=['year','state','pop'])
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
如果传入的列找不到,则会产生NAN
>>> frame2=DataFrame(data,columns=['year','state','pop','debt'] ,index=['one','two','three','four','five'])
>>> frame2
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 NaN
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 NaN
five 2002 Nevada 2.9 NaN
取值,通过类似数组或属性的方式,可以获取某一列的数据(为一个Series)
>>> frame2['state'] #类似数组的方式
0 Ohio
1 Ohio
2 Ohio
3 Nevada
4 Nevada
Name: state, dtype: object
>>> frame2.year #类似属性的方式
0 2000
1 2001
2 2002
3 2001
4 2002
Name: year, dtype: int64
注意,返回的Series拥有原DataFrame相同的索引,且其name属性也已经被相应的设置好了。
获取行,行也可以通过位置或名称的方式来进行获取,比如用索引字段ix
>>> frame2.ix[2]
year 2002
state Ohio
pop 3.6
debt NaN
Name: 2, dtype: object
列可以通过赋值的方式进行修改。如下,我们可以给空的”debt“列赋值一个标量或一组值。
>>> import numpy as np
>>> frame2['dept']=np.arange(5) #为不存在的列赋值会创建一个新列
>>> frame2['debt']=12
>>> frame2
year state pop debt dept
0 2000 Ohio 1.5 12 0
1 2001 Ohio 1.7 12 1
2 2002 Ohio 3.6 12 2
3 2001 Nevada 2.4 12 3
4 2002 Nevada 2.9 12 4
删除,关键词del用于删除列
>>> del frame2['pop']
>>> frame2
year state debt dept
0 2000 Ohio 12 0
1 2001 Ohio 12 1
2 2002 Ohio 12 2
3 2001 Nevada 12 3
4 2002 Nevada 12 4
另一种常见的数据形式是嵌套字典(也就是字典的字典),将它传给DataFrame,就会被解释为:外层字典的键作为列,内层键作为行索引。
>>> pop={'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7, 2002:3.6}}
>>> frame3=DataFrame(pop) #使用嵌套字典构造DataFrame
>>> frame3
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
对结果进行 转置:
>>> frame3.T
2000 2001 2002
Nevada NaN 2.4 2.9
Ohio 1.5 1.7 3.6
设置index和columns的name属性:
>>> frame3.index.name='year'
>>> frame3.columns.name='state'
>>> frame3
state Nevada Ohio
year
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
可以用于构造DataFrame的数据:
三、索引对象
pandas的索引对象负责管理标签和其他元数据(比如轴名称等)。构建Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index:
>>> obj=Series(range(3),index=['a','b','c'])
>>> obj.index
Index([u'a', u'b', u'c'], dtype='object')
Idex对象是不可修改的,因此用户不能对其修改。不可修改性非常重要,因为这样才能使得index对象在多个数据结构之间安全共享:
>>> index=pd.Index(np.arange(3))
>>> obj2=Series([1.5,-2.5,0],index=index)
>>> obj2.index is index
True
index的方法和属性:
参考:
《利用python进行数据分析》