Pandas入门(上)
Martin
pandas数据结构介绍
要使用pandas首先得熟悉它的两个数据结构:Series
和DataFrame
。
- Series
Series是一种类似于一维数组的对象,它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即标签)组成。仅由一组数据即可产生最简单的Series:
>>> obj = Series([4,7,-5,3])
>>> obj
0 4
1 7
2 -5
3 3
dtype: int64
Series的字符串表现形式为:索引在左边,值在右边。由于我们没有为数据指定索引,于是会自动创建一个0到N-1(N为数据长度)的整数型索引。你可以通过Series的values
和index
属性获取其数组形式和索引对象:
>>> obj.values
array([ 4, 7, -5, 3])
>>> obj.index
RangeIndex(start=0, stop=4, step=1) # 开始索引下标为0,结束为4,步长为1
但是一般情况下,我们希望创建一个可以各个数据点进行标记的索引:
>>> obj2 = Series([4,7,-5,3],index=['d','b','a','c'])
>>> obj2
d 4
b 7
a -5
c 3
dtype: int64
与普通数组相比,你可以通过索引的方式选取Series中的单个或一组值:
>>> obj2['a']
-5
>>> obj2['b']
7
>>> obj2[['b','a','d']]
b 7
a -5
d 4
dtype: int64
如果数据被存放在一个python字典中,也可以直接通过这个字典来创建Series,并且如果只传入一个字典,则结果Series中的索引就是原字典的键(有序字典排序)。
>>> sdata = {
'Ohio':35000,'Texas':71000,'Oregon':16000,'Utah':5000}
>>> obj3 = Series(sdata)
>>> obj3
Ohio 35000
Oregon 16000
Texas 71000
Utah 5000
dtype: int64
再来下面这个例子:
>>> sdata = {
'Ohio':35000,'Texas':71000,'Oregon':16000,'Utah':5000}
>>> states = ['California','Ohio','Oregon','Texas']
>>> obj4 = Series(sdata,index=states)
>>> obj4
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
dtype: float64
在这个例子中,sdata中跟states索引相匹配的那3个值会被找出来并放到相应位置上,但由于California
所对应的sdata
值找不到,所以结果就是NaN
(即“非数字”not a number),在pandas中它用于表示缺失或NA值,以后将会使用NA表示数据缺失。pandas的isnull
和notnull
函数可用于检测缺失数据:
>>> pd.isnull(obj4) # 顶层函数调用
California True
Ohio False
Oregon False
Texas False
dtype: bool
>>> obj4.isnull() # 实例方法调用
California True
Ohio False
Oregon False
Texas False
dtype: bool
>>> pd.notnull(obj4)
California False
Ohio True
Oregon True
Texas True
dtype: bool
Series最重要的一个功能就是:在算数运算中能自动对齐不同索引的数据。
>>> obj3
Ohio 35000
Oregon 16000
Texas 71000
Utah 5000
dtype: int64
>>> obj4
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
dtype: float64
>>> obj3+obj4
California NaN # obj3中没有此项,自动变为NA值
Ohio 70000.0
Oregon 32000.0 # 自动对齐数据并运算
Texas 142000.0
Utah NaN # obj4中没有此项,自动变为NA值
dtype: float64
Series对象本身及其索引都有一个name
属性,该属性跟pandas
其他的关键功能关系非常密切:
>>> obj4.name = 'population'
>>> obj4.index.name = 'state'
>>> obj4
state
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
Name: population, dtype: float64
Series的索引可以通过赋值的方式就地修改:
>>> obj.index = ['Bob','Steve','Jeff','Ryan']
>>> obj
Bob 4
Steve 7
Jeff -5
Ryan 3
dtype: int64
- DataFrame
DataFrame是一个表格型的数据结构。它含有一组有序的的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看成是有Series
组成的字典(共用一个索引)。
构建DataFrame
的办法有很多,常用的有两种方式:
- 一种是直接传入一个由等长列表或
Numpy数组
构成的字典 - 另一种是嵌套字典(也就是字典的字典)
下面来看一下第一种常用方式:
>>> 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
结果会自动加上索引(跟Series一样),且全部列会被有序排列。
如果指定了列序列,则DataFrame的列就会按照指定顺序进行排列,指定列顺序用参数columns
完成:
>>> 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
跟Series
一样,如果传入的列在数据中找不到,就会产生NA
值:
>>> frame2 = DataFrame(data,columns=['year','state','pop','debt'],index=['one','two','three','four','five'])
>>> frame2
year state pop debt # debt列在data数据中找不到,故标记为NA
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
通过类似字典获取value
的方式,对DataFrame
列也可以使用,返回为一个Series
对象:
>>> frame2['year'] # 选取列数据
one 2000
two 2001
three 2002
four 2001
five 2002
Name: year, dtype: int64
>>> frame2.year # 这种方式跟上面的效果一样
one 2000
two 2001
three 2002
four 2001
five 2002
Name: year, dtype: int64
注意:返回的Series
拥有原DataFrame
相同的索引,且其name
属性已经被设置好。但是这种获取方式仅适用于列,对于行也就是axis=0来说,就要用相应的特殊方法.ix
。
>>> frame2.ix['three'] # 获取`three`行的数据
year 2002
state Ohio
pop 3.6
debt NaN
Name: three, dtype: object
列可以通过赋值方式进行修改,例如,可以给那个空列debt
赋值:
>>> frame2['debt'] = 1
>>> frame2
year state pop debt
one 2000 Ohio 1.5 1
two 2001 Ohio 1.7 1
three 2002 Ohio 3.6 1
four 2001 Nevada 2.4 1
five 2002 Neva