利用Python进行数据分析(五)之pandas入门

来源:互联网 发布:腾讯课堂录制软件 编辑:程序博客网 时间:2024/05/20 20:05

pandas入门

pandas毫无疑问是数据分析最基础的库之一。pandas是基于NumPy构建的。本书的作者就是pandas的作者~
引用:

from pandas import Series,DataFrameimport pandas as pd

pandas的数据结构(Series和DataFrame)

Series

Series由一组数据(各种NumPy数据类型)以及一组与之相关的索引组成。仅由一组数据即可产生最简单的Series:

In[4]:obj = Series([4,7,-5,3])In[5]:obj0ut[5]:0   41   72   -53   3

你也可以通过values和index属性来获取值和索引:

In [6]:obj.valuesOut[6]:array([4,7,-5,3])In[7]:obj.indexOut[7]:Int64Index([o,1,2,3])

当然你可以指定索引,而不是默认的0~(length-1):

In [8]:obj2 = Series([4,7,-5,3],index=['d','b',‘a','c'])In[9]:obj20ut[9]:d   4b   7a   -5c   3In[10]:obj2.index0ut[10]:Index([d,b,a,c],dtype=object)

建立完了,当然要会怎么获取值啦:

In[11]:obj2['a']0ut[11]:-5In[12]:obj2['d'] = 6In [13]:obj2[['c',‘a',‘d']]0ut[13]:c   3a   -5d   6

NumPy数组运算都会保留索引和值之间的链接。
你很容易联想到有序字典,比如:

In [18]:'b'in obj20ut[18]:TrueIn [19]:'e'in obj20ut[19]:False

或者:

In [20]:sdata={'ohio':35000,‘Texas':71000,‘0regon':16000,‘Utah':5000}In[21]:obj3=Series(sdata)In[22]:obj3out[22]:ohio 350000regon 16000Texas71000Utah 5000
In[23]:states = ['California','Ohio',‘Oregon','Texas']In[24]:obj4 = Series(sdata,index=states)In [25]:obj40ut[25]:California NaNOhio    350000regon  16000Texas   71000#可以理解为先建立index,全为NaN(not a number),然后把前面数组的值填到相应的索引下去。

用pandas的 isnull和notnull可检测缺失数据。
pd.innull(obj4) pd.notnull(obj4) obj4.isnull()返回索引+值(bool)

Series的自动对齐不同索引的数据被许多的应用来使用:

In[29]:obj3             In[30]obj4Out[29]:                    Out[30]Ohio    35000               California   NaN0regon  160000              hio     35000Texas   710000              regon   16000Utah     5000               Texas   71000In [31]:obj3+obj40ut[31]:California  NaNOhio        70000Oregon      32000Texas       142000Utah        NaN#Utah得到NaN比较特殊

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

In [32]:obj4.name=‘population'In[33]:obj4.index.name='state'In [34]:obj40ut[34]:stateCalifornia NaN0hio350000regon16000Texas71000Name:population

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

In [35]:obj.index=['Bob','Steve','Jeff','Ryan']In [36]:objout[36]:Bob     4Steve   7Jeff        -5Ryan    3

DataFrame

应该可以这么理解,DataFrame在pandas里就像表格一样的二维结构。(注意:虽然DataFrame是以二维结构保存数据的,但你仍然可以轻松地将其表示为更高维度的数据(层次化索引的表格型结构,这是pandas中许多高级数据处理功能的关键要素))

data={'state':['ohio','ohio','ohio','Nevada','Nevada'],'year':[2000,2001,2002,2001,2002],'pop':[1.5,1.7,3.6,2.42.9]}frame = DataFrame(data)In[38]:frame0ut[38]:    pop state   year0   1.5 Ohio    20001   1.7 Ohio    20012   3.6 Ohio    20023   2.4 Nevada  20014   2.9 Nevada  2002
In [40]:frame2 = DataFrame(data,columns=['year','state',‘pop','debt'],index = ['one','two','three','four','five'])In [41]:frame20ut[41]:      year state  pop debtone   2000 Ohio   1.5 NaNtwo   2001 Ohio   1.7 NaNthree 2002 Ohio   3.6 NaNfour  2001 Nevada 2.4 NaNfive  2002 Nevada 2.9 NaN#通过columns可以指明列顺序,没有值则为NaN

通过frame2[‘state’]或者frame2.state可获取到Series:

one   Ohiotwo   Ohiothree Ohiofour  Nevadafive  NevadaName:state

frame2.ix[‘three’] :索引字段ix
frame2[‘debt’] = 16.5 :列赋值
frame2[‘debt’] = np.arange(5.) :debt赋值0-4,长度要匹配。
val = Series([-1.2,-1.5,-1.7],index=[‘two’,’four’,’five’])
frame2[‘debt’] = val : 赋值Series,匹配索引,其他的会填上NaN

给不存在的列赋值会创建列,然后del用于删除列,如下:

In [53]:frame2['eastern']=frame2.state=='Ohio'In[54]:frame20ut[54]:      year state  pop  debt  easternone   2000 Ohio   1.5  NaN   Truetwo   2001 Ohio   1.7  -1.2  Truethree 2002 Ohio   3.6  NaN   Truefour  2001 Nevada 2.4  -1.5 Falsefive  2002 Nevada 2.9  -1.7 FalseIn [5s]:del framez['eastern']In [56]:frame2.columns0ut[56]:Index([year,state,pop,debt],dtype=object)

同样的,通过索引方式返回的列只是相应数据的视图而已,并不是副本。因此,对返回的Series所做的任何就地修改全都会反映到源DataFrame上。通过Series的copy方法即可显式地复制列。

另外一种常见的数据形式是嵌套字典:

In [57]:pop={'Nevada':{2001:2.4,2002:2.9},            'Ohio':{2000:1.5,2001:1.7,2002:3.6}}

如果将它传给DataFrame,它就会被解释为:外层字典的键作为列,内层键则作为行
索引(也可以显示指定索引):

In [58]:frame3=DataFrame(pop)In [59]:frame30ut[59]:    Nevada Ohio2000   NaN  1.52001   2.4  1.72002   2.9  3.6

然后 你还可以转置:
fram3.T
得到的是:
2000 2001 2002
Nevada NaN 2.4 2.9
Ohio 1.5 1.7 3.6

In[62]:pdata={'ohio':frame3['ohio'][:-1],            Nevada':frame3['Nevada][:2]}In [63]:DataFrame(pdata)Out[63]:    Nevada Ohio2000   NaN 1.52001   2.4 1.7

([:-1]代表0到最后一个 但是左闭右开哈)
可以输入给DataFrame的数据(很多都支持。。。)

类型 说明 二维ndarray 数据矩阵,还可以传入行标和列标 由数组、列表或元组组成的字典 每个序列会变成DataFrame的一列。所有序列的长度必须相同 NumPy的结构化/记录数组 类似于“由数组组成的字典” 由Series组成的字典 每个Series会成为一列。如果没有显式指定索引,则各Series的索引会被合并成结果的行索引 由字典组成的字典 各内层字典会成为一列。键会被合并成结果的行索引,跟“由Series组成的字典”的情况一样 字典或Series的列表 各项将会成为DataFrame的一行。字典键或Series索引的并集将会成为DataFrame的列标 由列表或元组组成的列表 类似于“二维ndarray” 另一个DataFrame 该DataFrame的索引将会被沿用,除非显式指定了其他索引 NumPy的MaskedArray 类似于“二维ndarray”的情况,只是掩码值在结果DataFrame会变成NA/缺失值

也可以直接设置DataFrame的index和columns的name属性,同样frame3.values返回的是二维ndarray的形式。

索引对象

In[68]:obj = Series(range(3),index=['a','b','c'])In[69]:index = obj.indexIn[7o]:indexout[7o]:Index([a,b,c],dtype=object)In[71]:index[1:]out[71]:Index([b,c],dtype=object)#Index对象是不可修改的(immutable),因此用户不能对其进行修改:In[72]:index[1]='d'#抛出异常

不可修改性非常重要,因为这样才能使Index对象在多个数据结构之间安全共享:

In[73]:index = pd.Index(np.arange(3))In[74]:obj2 = Series([1.5,-2.5,0],index=index)In[75]:obj2.index is indexOut[75]:True

表5-2:pandas中主要的Index对象

类 说明 Index 最泛化的Index对象,将轴标签表示为一个由Python对象组成的NumPy数组 Int64|lndex 针对整数的特殊Index Multilndex “层次化”索引对象,表示单个轴上的多层索引。可以看做由元组组成的数组 Datetimelndex 存储纳秒级时间戳(用NumPy的datetime64类型表示) Periodlndex 针对Period数据(时间间隔)的特殊Index

表5-3:Index的方法和属性

方法 说明 append 连接另一个Index对象,产生一个新的Index diff 计算差集,并得到一个Index intersection 计算交集 union 计算并集 isin 计算一个指示各值是否都包含在参数集合中的布尔型数组 delete 删除索引i处的元素,并得到新的Index drop 删除传入的值,并得到新的Index insert 将元素插入到索引i处,并得到新的Index is_monotonic 当各元素均大于等于前一个元素时,返回True is_unique 当ndex没有重复值时,返回True unique 计算ndex中唯一值的数组

总结:主要讲的是pandas的数据结构(Series和DataFrame),感觉DataFrame就是二维的Series,很多方法和理解都是相通的。DataFrame在之后的使用过程中应该会非常频繁的使用到。

阅读全文
0 0
原创粉丝点击