CHAPTER 5 Pandas 入门
5.1pandas数据结构介绍 Getting Started with pandas¶
In [5]:
import pandas as pd
In [7]:
from pandas import Series, DataFrame
5.1.1 Series
Series是一种一维的数组类型对象,它包含了一个值序列,并且包含了数据标签,称为索引。最简单的序列可以仅仅由一个数组组成
In [49]:
series_01=pd.Series([4,7,-5,3])
series_01
Out[49]:
0 4
1 7
2 -5
3 3
dtype: int64
交互式环境中Series的字符串表示,索引(index/rows)在左边,值(values/colums/variables)在右边。索引的默认从0到N-1(N是数据的长度)
In [50]:
series_01.values #values获取对象的值
Out[50]:
array([ 4, 7, -5, 3], dtype=int64)
In [51]:
series_01.index #与range(4)类似,index获取对象的索引
Out[51]:
RangeIndex(start=0, stop=4, step=1)
也可以自己创建一个索引序列,用标签标识每个数据点
In [11]:
series_02=pd.Series([4,7,-5,3],index=['d','b','a','c'])
series_02
Out[11]:
d 4
b 7
a -5
c 3
dtype: int64
与Numpy数组相比,也可以从数据中用标签进行索引而选择数据
In [16]:
series_02['a']
#series_02.a 也可以取出对应对象值,但是不安全,上面更好
Out[16]:
-5
In [17]:
series_02['d']=6 #改变对应索引的对象值
In [18]:
series_02[['c','a','d']] #['c','a','d']包含的不是数字而是字符串,作为索引列表
Out[18]:
c 3
a -5
d 6
dtype: int64
使用NumPy函数,比如布尔值数组进行过滤,与标量相乘,或者应用数学函数,这些操作将保存索引值连接
In [19]:
series_02[series_02>0]
Out[19]:
d 6
b 7
c 3
dtype: int64
In [20]:
series_02*2
Out[20]:
d 12
b 14
a -10
c 6
dtype: int64
In [9]:
import numpy as np
In [22]:
np.exp(series_02)
Out[22]:
d 403.428793
b 1096.633158
a 0.006738
c 20.085537
dtype: float64
Series看作一个长度固定且有序的字典
In [23]:
'b' in series_02
Out[23]:
True
In [24]:
'e' in series_02
Out[24]:
False
如果你已经有数据在python字典中,也可以用python生成一个Series
In [28]:
sdata={
'Ohio':35000,'Texas':71000,'Oregon':16000,'Utah':5000}
In [30]:
series_03=pd.Series(sdata)
series_03
Out[30]:
Ohio 35000
Texas 71000
Oregon 16000
Utah 5000
dtype: int64
我们可以将字典键按照我们想要的顺序传递给构造函数,从而生成的多因顺序符合预期
In [34]:
states=['California','Ohio','Oregon','Texas']
In [35]:
series_04=pd.Series(sdata,index=states)
series_04
Out[35]:
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
dtype: float64
sdata中三个值被放在正确的位置,但由于’California’没有出现在sdata中,因此对应的只为NaN,这是pandas中缺失值或NA值的方式
pandas中使用isnull和notnull函数来检查缺失数据
In [36]:
pd.isnull(series_04)
Out[36]:
California True
Ohio False
Oregon False
Texas False
dtype: bool
In [37]:
pd.notnull(series_04)
Out[37]:
California False
Ohio True
Oregon True
Texas True
dtype: bool
isnull和notnull也是series的实例方法
In [38]:
series_04.isnull()
Out[38]:
California True
Ohio False
Oregon False
Texas False
dtype: bool
在数学操作中自动对齐索引是Series的一个特性
In [39]:
series_03
Out[39]:
Ohio 35000
Texas 71000
Oregon 16000
Utah 5000
dtype: int64
In [40]:
series_04
Out[40]:
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
dtype: float64
In [42]:
series_03+series_04
Out[42]:
California NaN
Ohio 70000.0
Oregon 32000.0
Texas 142000.0
Utah NaN
dtype: float64
Series对象自身和其索引都有name属性,这个特性和pandas其他功能集成在一起
In [43]:
series_04.name='population'
In [44]:
series_04.index.name='state'
In [45]:
series_04
Out[45]:
state
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
Name: population, dtype: float64
Series索引可以按位置赋值的方式进行改变
In [52]:
series_01
Out[52]:
0 4
1 7
2 -5
3 3
dtype: int64
In [54]:
series_01.index=['bob','steve','jeff','ryan']
series_01
Out[54]:
bob 4
steve 7
jeff -5
ryan 3
dtype: int64
5.1.2 DataFrame
DataFrame表示的是矩阵的数据表,它包含了已排列的列集合,每一列都可以是不同的值的类型(数值、字符串、布尔值等)。其既有行索引又有列索引,可以被视为是一个共享相同索引的series字典
In [37]:
data={
'state':['ohio','ohio','ohio','nevada','nevada','nevada'],
'year':[2000,20001,2002,2001,2003,2003],
'pop':[1.5,1.7,3.6,2.4,2.9,3.2]}
frame=pd.DataFrame(data)
产生的DataFrame会自动为Series分配索引,并且列会按照排列的顺序排序
In [38]:
frame
Out[38]:
对于大型DataFrame,head方法只会选出头部五行
In [39]:
frame.head() #通常只显示列表前五行
Out[39]:
如果我指定列顺序,则会按照只当顺序排序
In [40]:
pd.DataFrame(data,columns=['year','state','pop'])
Out[40]:
如果你传的列不在字典中,将会在结果中出现缺失值
In [41]:
frame2=pd.DataFrame(data,columns=['year','state','pop','debt'],
index=['one','two','three','four','five','six'])
frame2
Out[41]:
可以按照字典型标记或者属性那样检索为series
In [43]:
frame2['state']
Out[43]:
one ohio
two ohio
three ohio
four nevada
five nevada
six nevada
Name: state, dtype: object
In [44]:
frame2.year #frame[column]对于任意列名均有效,但是frame2.column只在列名是有效的python变量名时有效
Out[44]:
one 2000
two 20001
three 2002
four 2001
five 2003
six 2003
Name: year, dtype: int64
行也可以通过特殊位置或者特殊属性loc进行选取
In [45]:
frame2.loc['three'] #loc则是指定位置行的选取
Out[45]:
year 2002
state ohio
pop 3.6
debt NaN
Name: three, dtype: object
In [46]:
frame2.iloc[:2] #iloc按照整数索引来取
Out[46]:
列的引用可以修改
In [47]:
frame2['debt']=16.5
frame2
Out[47]:
In [48]:
frame2['debt']=np.arange(6.)
frame2
Out[48]:
In [49]:
frame2['debt']=np.arange(frame2.shape[0]) #这样就可以确保填充的长度刚好一致
frame2
Out[49]:
要把列表或数组赋值给一个列时,值的长度必须和DaraFrame的长度相匹配
In [50]:
val=pd.Series([-1.2,-1.5,-1.7],index=['two','four','five'])
In [51]:
frame2['debt']=val
frame2
Out[51]:
如果赋值的列并不存在,则会生成一个新的列。我们可以使用del对DataFrame删除列
In [52]:
frame2['eastern']=frame2.state=='ohio'
frame2
Out[52]:
del方法用于可以移除之前创建的列
In [53]:
del frame2['eastern']
In [54]:
frame2.columns
Out[54]:
Index(['year', 'state', 'pop', 'debt'], dtype='object')
常用的数据形式是包含字典的嵌套字典
In [55]:
pop={
'nevada':{
2001:2.4,2002:2.9},
'ohio':{
2000:1.5,2001:1.7,2002:3.6}} #pandas会将字典的键作为列,将内部字典的键作为行索引
In [56]:
frame3=pd.DataFrame(pop)
frame3
Out[56]:
也可以进行转置操作
In [57]