




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1pandas—入門1pandas—入門目錄pandas的數(shù)據(jù)結(jié)構(gòu)介紹SeriesDataFrame索引對象基本功能重新索引丟棄指定軸上的項索引、選取和過濾算術(shù)運算和數(shù)據(jù)對齊函數(shù)應(yīng)用和映射排序和排名帶有重復(fù)值的軸索引2目錄pandas的數(shù)據(jù)結(jié)構(gòu)介紹2目錄匯總和計算描述統(tǒng)計相關(guān)系數(shù)與協(xié)方差唯一值、值計數(shù)以及成員資格處理缺失數(shù)據(jù)濾除缺失數(shù)據(jù)填充缺失數(shù)據(jù)層次化索引重排分級順序根據(jù)級別匯總統(tǒng)計使用DataFrame的列其他有關(guān)pandas的話題3目錄匯總和計算描述統(tǒng)計34pandas含有使數(shù)據(jù)分析工作變得更快更簡單的高級數(shù)據(jù)結(jié)構(gòu)和操作工具。它是基于NumPy構(gòu)建的,讓以NumPy為中心的應(yīng)用變得更加簡單。因為Series和DataFrame用的次數(shù)非常多,所以將其引入本地命名空間中會更方便。>>>frompandasimportSeries,DataFrame>>>importpandasaspd4pandas含有使數(shù)據(jù)分析工作變得更快pandas的數(shù)據(jù)結(jié)構(gòu)介紹SeriesSeries是一種類似于一維數(shù)組的對象,它由一組數(shù)據(jù)(各種NumPy數(shù)據(jù)類型)以及一組與之相關(guān)的數(shù)據(jù)標(biāo)簽(即索引)組成。僅由一組數(shù)據(jù)即可產(chǎn)生最簡單的Series:
5>>>obj=Series([4,7,-5,3])>>>obj04172-533dtype:int64pandas的數(shù)據(jù)結(jié)構(gòu)介紹Series5>>>obj=Spandas的數(shù)據(jù)結(jié)構(gòu)介紹Series的字符串表現(xiàn)形式為:索引在左邊,值在右邊。由于沒有為數(shù)據(jù)指定索引,于是會自動創(chuàng)建一個0到N-1(N為數(shù)據(jù)的長度)的整數(shù)型索引??梢酝ㄟ^Series的values和index屬性獲取其數(shù)組表示形式和索引對象:
6>>>obj.valuesarray([4,7,-5,3],dtype=int64)>>>obj.indexInt64Index([0,1,2,3],dtype='int64')pandas的數(shù)據(jù)結(jié)構(gòu)介紹Series的pandas的數(shù)據(jù)結(jié)構(gòu)介紹
通常希望所創(chuàng)建的Series帶有一個可以對各個數(shù)據(jù)點進(jìn)行標(biāo)記的索引:7>>>obj2=Series([4,7,-5,3],index=['d','b','a','c'])>>>obj2d4b7a-5c3dtype:int64>>>obj2.indexIndex([u'd',u'b',u'a',u'c'],dtype='object')pandas的數(shù)據(jù)結(jié)構(gòu)介紹通常希望所創(chuàng)建pandas的數(shù)據(jù)結(jié)構(gòu)介紹與普通NumPy數(shù)組相比,可以通過索引的方式選取Series中的單個或一組值:8>>>obj2['a']-5>>>obj2['d']=6>>>obj2[['c','a','d']]c3a-5d6dtype:int64pandas的數(shù)據(jù)結(jié)構(gòu)介紹與普通NumPypandas的數(shù)據(jù)結(jié)構(gòu)介紹NumPy數(shù)組運算(如根據(jù)布爾型數(shù)組進(jìn)行過濾、標(biāo)量乘法、應(yīng)用數(shù)學(xué)函數(shù)等)都會保留索引和值之間的鏈接:9>>>obj2>>>obj2[obj2>0]>>>obj2*2>>>np.exp(obj2)d403.428793b1096.633158a0.006738c20.085537dtype:float64pandas的數(shù)據(jù)結(jié)構(gòu)介紹NumPy數(shù)組pandas的數(shù)據(jù)結(jié)構(gòu)介紹還可以將Series看成是一個定長的有序字典,因為它是索引值到數(shù)據(jù)值的一個映射。它可以用在許多原本需要字典參數(shù)的函數(shù)中:10>>>'b'inobj2True>>>'e'inobj2Falsepandas的數(shù)據(jù)結(jié)構(gòu)介紹還可以將Serpandas的數(shù)據(jù)結(jié)構(gòu)介紹11如果數(shù)據(jù)被存放在一個Python字典中,也可以直接通過這個字典來創(chuàng)建Series:>>>sdata={'Ohio':35000,'Texas':71000,'Oregon':16000,'Utah':5000}>>>obj3=Series(sdata)>>>obj3Ohio35000Oregon16000Texas71000Utah5000dtype:int64pandas的數(shù)據(jù)結(jié)構(gòu)介紹11如果數(shù)據(jù)被存pandas的數(shù)據(jù)結(jié)構(gòu)介紹如果只傳入一個字典,則結(jié)果Series中的索引就是原字典的鍵(有序排列)。在例子中,sdata跟states索引相匹配的那3個值會被找出來并放到相應(yīng)的位置上,但由于“California”所對應(yīng)的sdata值找不到,所以其結(jié)果就為NaN(即“非數(shù)字”(notanumber)).
12>>>states=['California','Ohio','Oregon','Texas']>>>obj4=Series(sdata,index=states)>>>obj4CaliforniaNaNOhio35000Oregon16000Texas71000dtype:float64pandas的數(shù)據(jù)結(jié)構(gòu)介紹如果只傳入一個字pandas的數(shù)據(jù)結(jié)構(gòu)介紹
在pandas中使用
NaN表示缺失(missing)或NA值。pandas的isnull和notnull函數(shù)可用于檢測缺失數(shù)據(jù):
13>>>pd.isnull(obj4)#Series也有類似的實例方法:CaliforniaTrue#obj4.isnull()OhioFalseOregonFalseTexasFalsedtype:bool>>>pd.notnull(obj4)CaliforniaFalseOhioTrueOregonTrueTexasTruedtype:boolpandas的數(shù)據(jù)結(jié)構(gòu)介紹在pandas中使用pandas的數(shù)據(jù)結(jié)構(gòu)介紹對于許多應(yīng)用而言,Series域重要的一個功能是:它在算術(shù)運算中會自動對齊不同索引的數(shù)據(jù)。
14>>>obj3>>>obj4>>>obj3+obj4CaliforniaNaNOhio70000Oregon32000Texas142000UtahNaNdtype:float64pandas的數(shù)據(jù)結(jié)構(gòu)介紹對于許多應(yīng)用而pandas的數(shù)據(jù)結(jié)構(gòu)介紹Series對象本身及其索引都有一個name屬性,該屬性跟pandas其他的關(guān)鍵功能關(guān)系非常密切:
15>>>='population'>>>='state'>>>obj4stateCaliforniaNaNOhio35000Oregon16000Texas71000Name:population,dtype:float64pandas的數(shù)據(jù)結(jié)構(gòu)介紹Series對pandas的數(shù)據(jù)結(jié)構(gòu)介紹16
Series的索引可以通過賦值的方式就地修改:>>>obj04172-533>>>obj.index=['Bob','Steve','Jeff','Ryan']>>>objBob4Steve7Jeff-5Ryan3dtype:int64pandas的數(shù)據(jù)結(jié)構(gòu)介紹16Seriespandas的數(shù)據(jù)結(jié)構(gòu)介紹17DataFrameDataFrame是一個表格型的數(shù)據(jù)結(jié)構(gòu),它含有一組有序的列,每列可以是不同的值類型(數(shù)值、字符串、布爾值等)。DataFrame既有行索引也有列索引,它可以被看做由Series組成的字典(共用同一個索引)。跟其他類似的數(shù)據(jù)結(jié)構(gòu)相比(如R的data.frame),DataFrame中面向行和面向列的操作基本上是平衡的。其實,DataFrame中的數(shù)據(jù)是以一個或多個二維塊存放的(而不是列表、字典或別的一維數(shù)據(jù)結(jié)構(gòu))。pandas的數(shù)據(jù)結(jié)構(gòu)介紹17DataFramepandas的數(shù)據(jù)結(jié)構(gòu)介紹
構(gòu)建DataFrame的辦法有很多,最常用的一種是直接傳入一個由等長列表或NumPy數(shù)組組成的字典:結(jié)果DataFrame會自動加上索引(跟Series一樣),且全部列會被有序悱列.18>>>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)>>>framepandas的數(shù)據(jù)結(jié)構(gòu)介紹構(gòu)建DataFrpandas的數(shù)據(jù)結(jié)構(gòu)介紹如果指定了列序列,則DataFrame的列就會按照指定順序迸行排列:跟Series一樣,如果傳入的列在數(shù)據(jù)中找不到,就會產(chǎn)生NA值:
19>>>DataFrame(data,columns=['year','state','pop'])>>>frame2=DataFrame(data,columns=['year','state','pop','debt'],index=['one','two','three','four','five'])>>>frame2>>>frame2.columnsIndex([u'year',u'state',u'pop',u'debt'],dtype='object')pandas的數(shù)據(jù)結(jié)構(gòu)介紹如果指定了列序pandas的數(shù)據(jù)結(jié)構(gòu)介紹通過類似字典標(biāo)記的方式或?qū)傩缘姆绞?,可以將DataFrame的列獲取為一個Series:20>>>frame2['state']oneOhiotwoOhiothreeOhiofourNevadafiveNevadaName:state,dtype:object>>>frame2.yearone2000two2001three2002four2001five2002Name:year,dtype:int64pandas的數(shù)據(jù)結(jié)構(gòu)介紹通過類似字典標(biāo)記pandas的數(shù)據(jù)結(jié)構(gòu)介紹
注意,返冋的Series擁有原DataFrame相同的索引,且其name屬性也已經(jīng)被相應(yīng)地設(shè)置好了。行也可以通過位置或名稱的方式進(jìn)行獲取,比如用索引字段ix:21>>>frame2.ix['three']year2002stateOhiopop3.6debtNaNName:three,dtype:objectpandas的數(shù)據(jù)結(jié)構(gòu)介紹注意,返冋的Sepandas的數(shù)據(jù)結(jié)構(gòu)介紹列可以通過賦值的方式進(jìn)行修改。例如,可以給那個空的“debt”列賦上一個標(biāo)量值或一組值:22>>>frame2['debt']=16.5>>>frame2>>>frame2['debt']=np.arange(5)>>>frame2pandas的數(shù)據(jù)結(jié)構(gòu)介紹列可以通過賦值pandas的數(shù)據(jù)結(jié)構(gòu)介紹23將列表或數(shù)組賦值給某個列時,其長度必須跟DataFrame的長度相匹配。如果賦值的是一個Series,就會精確匹配DataFrame的索引,所有的空位都將被填上缺失值:>>>val=Series([-1.2,-1.5,-1.7],index=['two','four','five'])>>>frame2['debt']=val>>>frame2pandas的數(shù)據(jù)結(jié)構(gòu)介紹23將列表或數(shù)組pandas的數(shù)據(jù)結(jié)構(gòu)介紹為不存在的列賦值會創(chuàng)建出一個新列。關(guān)鍵字del用于刪除列:24>>>frame2['eastern']=frame2.state=='Ohio'>>>frame2>>>delframe2['eastern']>>>frame2.columnsIndex([u'year',u'state',u'pop',u'debt'],dtype='object‘)pandas的數(shù)據(jù)結(jié)構(gòu)介紹為不存在的列賦pandas的數(shù)據(jù)結(jié)構(gòu)介紹
另一種常見的數(shù)據(jù)形式是嵌套字典(也就是字典的字典):如果將它傳給DataFrame,它就會被解釋為:外層字典的鍵作為列,內(nèi)層鍵則作為行索引:25>>>pop={'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7,2002:3.6}}>>>frame3=DataFrame(pop)>>>frame3>>>frame3.T#也可以對該結(jié)果進(jìn)行轉(zhuǎn)置pandas的數(shù)據(jù)結(jié)構(gòu)介紹另一種常見的數(shù)據(jù)pandas的數(shù)據(jù)結(jié)構(gòu)介紹內(nèi)層字典的鍵會被合并、排序以形成最終的索引。如果顯式指定了索引,則不會這樣:由Series組成的字典差不多也是一樣的用法:
26>>>DataFrame(pop,index=[2001,2002,2003])>>>frame3>>>pdata={'Ohio':frame3['Ohio'][:-1],'Nevada':frame3['Nevada'][:2]}>>>DataFrame(pdata)pandas的數(shù)據(jù)結(jié)構(gòu)介紹內(nèi)層字典的鍵會被pandas的數(shù)據(jù)結(jié)構(gòu)介紹27
如果設(shè)置了DataFrame的index和columns的name屬性,則這些信息也會被顯示出來:跟Series一樣,values屬性也會以二維ndarray的形式返回DataFrame中的數(shù)據(jù):>>>='year';='state'>>>frame3>>>='year';='state'>>>frame3.valuesarray([[nan,1.5],[2.4,1.7],[2.9,3.6]])pandas的數(shù)據(jù)結(jié)構(gòu)介紹27
如果設(shè)置pandas的數(shù)據(jù)結(jié)構(gòu)介紹28如果DataFrame各列的數(shù)據(jù)類型不同,則值數(shù)組的數(shù)據(jù)類型就會選用能兼容所有列的數(shù)據(jù)類型:>>>frame2>>>frame2.valuesarray([[2000L,'Ohio',1.5,nan],[2001L,'Ohio',1.7,-1.2],[2002L,'Ohio',3.6,nan],[2001L,'Nevada',2.4,-1.5],[2002L,'Nevada',2.9,-1.7]],dtype=object)pandas的數(shù)據(jù)結(jié)構(gòu)介紹28如果Datapandas的數(shù)據(jù)結(jié)構(gòu)介紹索引對象pandas的索引對象負(fù)責(zé)管理軸標(biāo)簽和其他元數(shù)據(jù)(比如軸名稱等)。構(gòu)建Series或DataFrame時,所用到的任何數(shù)組或其他序列的標(biāo)簽都會被轉(zhuǎn)換成一個Index:29>>>obj=Series(range(3),index=['a','b','c'])>>>index=obj.index>>>indexIndex([u'a',u'b',u'c'],dtype='object')>>>index[1:]Index([u'b',u'c'],dtype='object‘)pandas的數(shù)據(jù)結(jié)構(gòu)介紹索引對象29>>>obj=Spandas的數(shù)據(jù)結(jié)構(gòu)介紹
Index對象是不可修改的(immutable),因此用戶不能對其進(jìn)行修改:不可修改性非常重要,因為這樣才能使Index對象在多個數(shù)據(jù)結(jié)構(gòu)之間安全共享:30>>>index[1]='d'TypeError:Indexesdoesnotsupportmutableoperations>>>index=pd.Index(np.arange(3))>>>obj2=Series([1.5,-2.5,0],index=index)>>>obj2.indexisindexTruepandas的數(shù)據(jù)結(jié)構(gòu)介紹Index對象pandas的數(shù)據(jù)結(jié)構(gòu)介紹除了長得像數(shù)組,Index的功能也類似一個固定大小的集合:
每個索引都有一些方法和屬性,它們可用于設(shè)置邏輯并回答有關(guān)該索引所包含的數(shù)據(jù)的常見問題。
31>>>frame3>>>'Ohio'inframe3.columnsTrue>>>2003inframe3.indexFalsepandas的數(shù)據(jù)結(jié)構(gòu)介紹除了長得像數(shù)組pandas的數(shù)據(jù)結(jié)構(gòu)介紹
32方法說明append連接另一個Index對象,產(chǎn)生一個新的Indexdiff計算差集,并得到一個Indexintersection計算交集union計算并集isin計算一個指示各值是否都包含在參數(shù)集合中的布爾型數(shù)組delete刪除索引i處的元素,并得到新的Indexdrop刪除傳入的值,并得到新的Indexinsert將元素插入到索引i處,并得到新的Indexis_monotonic當(dāng)各元素均大于等于前一個元素時,返回Trueis.unique當(dāng)Index沒有重復(fù)值時,返回Trueunique計算Index中唯一值的數(shù)組Index的方法和屬性pandas的數(shù)據(jù)結(jié)構(gòu)介紹32方法說明ap基本功能重新索引pandas對象的一個重要方法是reindex,其作用是創(chuàng)建一個適應(yīng)新索引的新對象。以之前的一個簡單示例來說:
33>>>obj=Series([4.5,7.2,-5.3,3.6],index=['d','b','a','c'])>>>objd4.5b7.2a-5.3c3.6dtype:float64基本功能重新索引33>>>obj=Series([4.5基本功能34調(diào)用該Series的reindex將會根據(jù)新索引進(jìn)行重排。如果某個索引值當(dāng)前不存在,就引入缺失值:>>>obj2=obj.reindex(['a','b','c','d','e'])>>>obj2a-5.3b7.2c3.6d4.5eNaN>>>obj.reindex(['a','b','c','d','e'],fill_value=0)Out[126]:a-5.3b7.2c3.6d4.5e0.0基本功能34調(diào)用該Series的reind基本功能對于時間序列這樣的有序數(shù)據(jù),重新索引時可能需要做一些插值處理。method選項即可達(dá)到此目的,例如,使用ffill可以實現(xiàn)前向值填充:35>>>obj3=Series(['blue','purple','yellow'],index=[0,2,4])>>>obj3.reindex(range(6),method='ffill')0blue1blue2purple3purple4yellow5yellowdtype:object基本功能對于時間序列這樣的有序數(shù)據(jù),重新基本功能reindex的(插值)method選項
對于DataFrame,reindex可以修改(行)索引、列,或兩個都修改。如果僅傳入一個序列,則會重新索引行:36參數(shù) 說明ffill或pad 前向填充(或搬運)值bfill或backfill 后向填充(或搬運)值>>>frame=DataFrame(np.arange(9).reshape((3,3)),index=['a','c','d'],columns=['Ohio','Texas','California'])>>>frame>>>frame2=frame.reindex(['a','b','c','d'])>>>frame2基本功能reindex的(插值)method選基本功能37
使用columns關(guān)鍵字即可重新索引列:
也可以同時對行和列進(jìn)行重新索引,而插值則只能按行應(yīng)用(即軸0):利用ix的標(biāo)簽索引功能,重新索引任務(wù)可以變得更簡潔:
>>>states=['Texas','Utah','California']>>>frame.reindex(columns=states)>>>frame.reindex(index=['a','b','c','d'],method='ffill',columns=states)>>>frame.ix[['a','b','c','d'],states]基本功能37使用columns關(guān)鍵字即可基本功能reindex函數(shù)的參數(shù)38參數(shù) 說明index 用作索引的新序列。既可以是index實例,也
可以是其他序列型的Python數(shù)據(jù)結(jié)構(gòu)。Index
會被完全使用,就像沒有任何復(fù)制一樣。method插值(填充)方式。fill_value在重新索引的過程中,需要引入缺失值時使用
的替代值.limit 前向或后向填充時的最大填充量.level 在Multiindex的指定級別上匹配簡單索引,否
則選取其子集copy 默認(rèn)為True,無論如何都復(fù)制;如果為False,
則新舊相等就不復(fù)制基本功能reindex函數(shù)的參數(shù)38參數(shù) 基本功能丟棄指定軸上的項丟棄某條軸上的一個或多個項很簡單,只要有一個索引數(shù)組或列表即可。由于需要執(zhí)行一些數(shù)據(jù)整理和集合邏輯,所以drop方法返回的是一個在指定軸上刪除了指定值的新對象:39>>>obj=Series(np.arange(5,),index=['a','b','c','d','e'])>>>new_obj=obj.drop('c')>>>new_obja0b1d3e4>>>obj.drop(['d','c'])基本功能丟棄指定軸上的項39>>>obj=Series(基本功能對于DataFrame,可以刪除任意軸上的索引值:40>>>data=DataFrame(np.arange(16).reshape((4,4)),index=['Ohio','Colorado','Utah','NewYork'],columns=['one','two','three','four'])>>>data.drop(['Colorado','Ohio'])>>>data.drop('two',axis=1)>>>data.drop(['two','four'],axis=1)基本功能對于DataFrame,可以刪除任意軸基本功能41索引、選取和過濾
Series索引(obj[...])的工作方式類似于NumPy數(shù)組的索引,只不過Series的索引值不只是整數(shù)。>>>obj=Series(np.arange(4,),index=['a','b','c','d'])>>>obj['b']1>>>obj[1]1>>>obj[2:4]c2d3dtype:int32基本功能41索引、選取和過濾>>>obj=Serie基本功能
42>>>obj[['b','a','d']]b1a0d3dtype:int32>>>obj[[1,3]]b1d3dtype:int32>>>obj[obj<2]a0b1dtype:int32基本功能42>>>obj[['b',基本功能利用標(biāo)簽的切片運算與普通的Python切片運算不同,當(dāng)使用非整數(shù)作為切片索引時,其末端是包含的(inclusive)
設(shè)置的方式也很簡單:
43>>>obj['b':'c']b1c2dtype:int32>>>obj['b':'c']=5>>>obja0b5c5d3基本功能利用標(biāo)簽的切片運算與普通的Pyth基本功能
對DataFrame進(jìn)行索引其實就是獲取一個或多個列:這種索引方式有幾個特殊的情況。首先通過切片或布爾型數(shù)組選取行:44>>>data['two']Ohio1Colorado5Utah9NewYork13>>>data[['three','one']]>>>data[:2]>>>data[data['three']>5]基本功能對DataFrame進(jìn)行索引其實基本功能45另一種用法是通過布爾型DataFrame(比如下面這個由標(biāo)量比較運算得出的)進(jìn)行索引:這段代碼的目的是使DataFrame在語法上更像ndarray。>>>data<5>>>data[data<5]=0>>>data基本功能45另一種用法是通過布爾型Data基本功能為了在DataFrame的行上進(jìn)行標(biāo)簽索引,引入了專門的索引字段ix。它可以通過NumPy式的標(biāo)記法以及軸標(biāo)簽從DataFrame中選取行和列的子集。這也是一種重新索引的簡單手段:46>>>data.ix['Colorado',['two','three']]two5three6Name:Colorado,dtype:int32>>>data.ix[['Colorado','Utah'],[3,0,1]]基本功能為了在DataFrame的行上進(jìn)行基本功能
47>>>data.ix[2]one8two9three10four11Name:Utah,dtype:int32>>>data.ix[:'Utah','two']Ohio0Colorado5Utah9Name:two,dtype:int32>>>data.ix[data.three>5,:3]>>>data.ix['Colorado',['two','three']]two5three6Name:Colorado,dtype:int32 基本功能47>>>data.ix[2]基本功能48
DataFrame的索引選項:類型 說明obj[val] 選取DataFrame的單個列或一組列。在一些特殊
情況下會比較便利:布爾型數(shù)組(過濾行)、切
片(行切片)、布爾型DataFrame(根據(jù)條件
設(shè)置值)。obj.ix[val] 選取DataFrame的單個行或一組行。obj.ix[:,val]選取單個列或列子集。obj.ix[val1,val2]同時選取行和列。reindex方法將一個或多個軸匹配到新索引。xs方法根據(jù)標(biāo)簽選取單行或單列,并返回一個Series。icol、irow方法根據(jù)整數(shù)位置選取單列或單行,并返回一個
Series。get.value,set_value方法根據(jù)行標(biāo)簽和列標(biāo)簽選取單個值。
基本功能48DataFrame的索引選項:類基本功能49算術(shù)運算和數(shù)據(jù)對齊
pandas最重要的一個功能是,它可以對不同索引的對象進(jìn)行算術(shù)運算。在將對象相加時,如果存在不同的索引對,則結(jié)果的索引就是該索引對的并集。>>>s1=Series([7.3,-2.5,3.4,1.5],index=['a','c','d','e'])>>>s2=Series([-2.1,3.6,-1.5,4,3.1],index=['a','c','e','f','g'])>>>s1>>>s2基本功能49算術(shù)運算和數(shù)據(jù)對齊>>>s1=Series(基本功能將它們相加就會產(chǎn)生:
自動的數(shù)據(jù)對齊操作在不重疊的索引處引入NA值。缺失值會在算術(shù)運算過程中傳播。50>>>s1+s2Out[201]:a5.2c1.1dNaNe0.0fNaNgNaNdtype:float64基本功能將它們相加就會產(chǎn)生:50>>>基本功能對于DataFrame,對齊操作會同時發(fā)生在行和列上:
51>>>df1=DataFrame(np.arange(9,).reshape((3,3)),columns=list('bcd'),index=['Ohio','Texas','Colorado'])>>>df2=DataFrame(np.arange(12,).reshape((4,3)),columns=list('bde'),index=['Utah','Ohio','Texas','Oregon'])>>>df1>>>df2>>>df1+df2#把它們相加后將會返回一個新的DataFrame,其索引和列為原來那兩個DataFrame的并集.基本功能對于DataFrame,對齊操作基本功能52在算術(shù)方法中填充值在對不同索引的對象進(jìn)行算術(shù)運算時,可能希望當(dāng)一個對象中某個軸標(biāo)簽在另一個對象中找不到時填充一個特殊值(比如0):>>>df1=DataFrame(np.arange(12).reshape((3,4)),columns=list('abcd'))>>>df2=DataFrame(np.arange(20.).reshape((4,5)),columns=list('abcde'))>>>df1>>>df2>>>df1+df2#將它們相加時,沒有重疊的位置就會產(chǎn)生NA值.基本功能52在算術(shù)方法中填充值>>>df1=DataFr基本功能使用df1的add方法,傳入df2以及一個fill_value參數(shù):與此類似,在對Series或DataFrame重新索引時,也可以指定一個填充值:
53>>>df1.add(df2,fill_value=0)>>>df1.reindex(columns=df2.columns,fill_value=0)靈活的算術(shù)方法
add用于加法(+)的方法sub用于減法(-)的方法div用于除法(/)的方法mul用于乘法(*)的方法
基本功能使用df1的add方法,傳入基本功能DataFrame和Series之間的運算跟NumPy數(shù)組一樣,DataFrame和Series之間算術(shù)運算也是有明確規(guī)定的。先來看一個具有啟發(fā)性的例子,計算一個二維數(shù)組與其某行之間的差:54>>>arr=np.arange(12.).reshape((3,4))>>>arrarray([[0.,1.,2.,3.],[4.,5.,6.,7.],[8.,9.,10.,11.]])>>>arr[0]array([0.,1.,2.,3.])>>>arr-arr[0]array([[0.,0.,0.,0.],[4.,4.,4.,4.],[8.,8.,8.,8.]])基本功能DataFrame和Series之間的運算54>>>基本功能這就叫做廣播(broadcasting)。DataFrame和Series之間的運算差不多也是如此:默認(rèn)情況下,DataFrame和Series之間的算術(shù)運算會將Series的索引匹配到DataFrame的列,然后沿著行一直向下廣播.55>>>frame=DataFrame(np.arange(12.).reshape((4,3)),columns=list('bde'),index=['Utah','Ohio','Texas','Oregon'])>>>series=frame.ix[0]>>>frame>>>series>>>frame-series基本功能這就叫做廣播(broadcasti基本功能如果某個索引值在DataFrame的列或Series的索引中找不到,則參與運算的兩個對象就會被重新索引以形成并集:如果希望匹配行且在列上廣播,則必須使用算術(shù)運算方法。例如:傳入的軸號就是希望匹配的軸。在本例中目的是匹配DauFrame的行索引并進(jìn)行廣播。
56>>>series2=Series(range(3),index=['b','e','f'])>>>frame+series2>>>series3=frame['d']>>>series3>>>frame.sub(series3,axis=0)基本功能如果某個索引值在DataFrame基本功能57函數(shù)應(yīng)用和映射NumPy的ufuncs(元素級數(shù)組方法)也可用于操作pandas對象:
>>>frame=DataFrame(np.random.randn(4,3),columns=list('bde'),index=['Utah','Ohio','Texas','Oregon'])>>>frame>>>np.abs(frame)基本功能57函數(shù)應(yīng)用和映射>>>frame=DataFr基本功能另一個常見的操作是,將函數(shù)應(yīng)用到由各列或行所形成的一維數(shù)組上。DataFrame的apply方法即可實現(xiàn)此功能:許多最為常見的數(shù)組統(tǒng)計功能都被實現(xiàn)成DataFrame的方法(如sum和mean),因此無需使用apply方法。58>>>f=lambdax:x.max()-x.min()>>>frame.apply(f)>>>frame.apply(f,axis=1)基本功能另一個常見的操作是,將函數(shù)應(yīng)用到基本功能59除標(biāo)量值外,傳遞給apply的函數(shù)還可以返回由多個值組成的Series:
>>>deff(x):returnSeries([x.min(),x.max()],index=['min','max'])>>>frame>>>frame.apply(f)基本功能59除標(biāo)量值外,傳遞給apply的基本功能60此外,元素級的Python函數(shù)也是可以用的。假如想得到frame中各個浮點值的格式化字符串,使用applymap即可:
之所以叫做applymap,是因為Series有一個用于應(yīng)用元素級函數(shù)的map方法:>>>format=lambdax:'%.2f'%x>>>frame.applymap(format)>>>frame['e'].map(format)基本功能60此外,元素級的Python函基本功能排序和排名根據(jù)條件對數(shù)據(jù)集排序(sorting)也是一種重要的內(nèi)置運算。要對行或列索引進(jìn)行排序(按字典順序),可使用sort_index方法,它將返回一個已排序的新對象:
61>>>obj=Series(range(4),index=['d','a','b','c'])>>>obj.sort_index()a1b2c3d0dtype:int64基本功能排序和排名61>>>obj=Series(ran基本功能62而對于DataFrame,則可以根據(jù)任意一個軸上的索引進(jìn)行排序:數(shù)據(jù)默認(rèn)是按升序排序的,但也可以降序排序:>>>frame=DataFrame(np.arange(8).reshape((2,4)),index=['three','one'],columns=['d','a','b','c'])>>>frame.sort_index()>>>frame.sort_index(axis=1)>>>frame.sort_index(axis=1,ascending=False)基本功能62而對于DataFrame,則基本功能若要按值對Series進(jìn)行徘序,可使用其order方法:63>>>obj=Series([4,7,-3,2])>>>obj.order()2-3320417>>>obj=Series([4,np.nan,1,np.nan,-3,2])>>>obj.order()#在排序時,缺失值默認(rèn)都會被放到Series的末尾.4-32152041NaNNaN基本功能若要按值對Series進(jìn)行徘序,可基本功能在DataFrame上,可能希望根據(jù)一個或多個列中的值進(jìn)行排序。將一個或多個列的名字傳遞給by選項即可達(dá)到該目的:要根據(jù)多個列進(jìn)行排序,傳入名稱的列表即可:64>>>frame=DataFrame({'b':[4,7,-3,2],'a':[0,1,0,1]})>>>frame>>>frame.sort_index(by='b')>>>frame.sort_index(by=['a','b'])基本功能在DataFrame上,可能希望根基本功能65排名(ranking)跟排序關(guān)系密切,且它會增設(shè)一個排名值(從1開始,一直到數(shù)組中有效數(shù)據(jù)的數(shù)量)。它跟numpy.argsort產(chǎn)生的間接排序索引差不多,只不過它可以根據(jù)某種規(guī)則破壞平級關(guān)系。Series和DataFrame的rank方法:默認(rèn)情況下,rank是通過“為各組分配一個平均排名”的方式破壞平級關(guān)系的:>>>obj=Series([7,-5,7,4,2,0,4])>>>obj071-52734425064>>>printobj.rank()06.511.026.534.543.052.064.5基本功能65排名(ranking)跟排序基本功能
66>>>obj.rank(method='first')#根據(jù)值在原數(shù)據(jù)中出現(xiàn)的順序給出排名:0611273443525>>>obj.rank(ascending=False,method='max')#按降序進(jìn)行排名:02172234455664基本功能66>>>obj.rank(method='f基本功能
DataFrame可以在行或列上計算排名:
67排名時用于破壞平級關(guān)系的method選項Method說明‘a(chǎn)verage’默認(rèn):在相等分組中,為各個值分配平均排名‘min’使用整個分組的最小排名‘max’使用整個分組的最大排名‘first’按值在原始數(shù)據(jù)中的出現(xiàn)順序分配排名
>>>frame =DataFrame({'b':[4.3,7,-3,2],'a':[0,1,0,1],'c':[-2,5,8,-2.5]})>>>frame>>>frame.rank(axis=1)基本功能67排名時用于破壞平級關(guān)系的method選項>>>基本功能帶有重復(fù)值的軸索引帶有重復(fù)索引值的Series:索引的is_unique屬性驗證是否是唯一的:
68>>>obj=Series(range(5),index=['a','a','b','b','c'])>>>obja0a1b2b3c4>>>obj.index.is_uniqueFalse基本功能帶有重復(fù)值的軸索引68>>>obj=Series基本功能對于帶有重復(fù)值的索引,數(shù)據(jù)選取的行為將會有些不同。如果某個索引對應(yīng)多個值,則返回一個Series;而對應(yīng)單個值的,則返回一個標(biāo)量值。對DataFrame的行進(jìn)行索引時也是如此:69>>>obj['a']a0a1>>>obj['c']4>>>df=DataFrame(np.random.randn(4,3),index=['a','a','b','b'])>>>df>>>df.ix['b']基本功能對于帶有重復(fù)值的索引,數(shù)據(jù)選取的行匯總和計算描述統(tǒng)計pandas對象擁有一組常用的數(shù)學(xué)和統(tǒng)計方法。它們大部分都屬于約簡和匯總統(tǒng)計,用于從Series中提取的個值(如sum或mean)或從DataFrame的行或列中提取一個Series。跟對應(yīng)的NumPy數(shù)組方法相比,它們都是基于沒有缺失數(shù)據(jù)的假設(shè)而構(gòu)建的。接下來看一個簡單的DataFrame:70>>>df=DataFrame([[1.4,np.nan],[7.1,-4.5],[np.nan,np.nan],[0.75,-1.3]],index=['a','b','c','d'],columns=['one','two'])>>>df匯總和計算描述統(tǒng)計pandas對象擁有一匯總和計算描述統(tǒng)計調(diào)用DataFrame的sum方法將會返回一個含有列小計的Series:71>>>df.sum()one9.25two-5.80dtype:float64#傳入axis=1將會按行進(jìn)行求和運算:>>>df.sum(axis=1)a1.40b2.60cNaNd-0.55dtype:float64匯總和計算描述統(tǒng)計調(diào)用DataFrame匯總和計算描述統(tǒng)計NA值會自動被排除,除非整個切片(這里指的是行或列)都是NA。通過skipna選項可以禁用該功能:72>>>df.mean(axis=1,skipna=False)aNaNb1.300cNaNd-0.275dtype:float64約簡方法的選項選項 說明axis 約簡的軸。DataFrame的行用0,列用1skipna 排除缺失值,默認(rèn)值為Truelevel 如果軸是層次化索引的(即Multiindex),則根據(jù)level分
組約簡匯總和計算描述統(tǒng)計NA值會自動被排除,除匯總和計算描述統(tǒng)計有些方法(如idxmin和idxmax)返回的是間接統(tǒng)計(比如達(dá)到最小值或最大值的索引):還有一種方法,它既不是約簡型也不是累計型。describe就是一個例子,它用于一次性產(chǎn)生多個匯總統(tǒng)計:
73>>>df.idxmax()onebtwod>>>df.cumsum()#累計型的計算>>>df.describe()匯總和計算描述統(tǒng)計有些方法(如idxmi匯總和計算描述統(tǒng)計對于非數(shù)值型數(shù)據(jù),describe會產(chǎn)生另外一種匯總統(tǒng)計:74>>>obj=Series(['a','a','b','c']*4)>>>obj>>>obj.describe()count16unique3topafreq8dtype:object匯總和計算描述統(tǒng)計對于非數(shù)值型數(shù)據(jù),de匯總和計算描述統(tǒng)計描述和匯總統(tǒng)計:75方法 說明count非NA值的數(shù)量describe針對Series或各DataFrame列計算匯總
統(tǒng)計min,max計算最小值和最大值argmin,argmax計算能夠獲取到最小值和最大值的索引位
置(整數(shù))idxmin,idxmax計算能夠獲取到最小值和最大值的索引值quantile計算樣本的分位數(shù)(0到1)sum值的總和mean值的平均數(shù)media值的算術(shù)中位數(shù)(50%分位數(shù))mad根據(jù)平均值計算平均絕對離差var樣本值的方差
匯總和計算描述統(tǒng)計描述和匯總統(tǒng)計:75方法 匯總和計算描述統(tǒng)計
描述和匯總統(tǒng)計(續(xù))76方法 說明std樣本值的標(biāo)準(zhǔn)差skew樣本值的偏度(三階矩)kurt樣本值的峰度(四階矩)cumsum樣本值的累計和cummin,cummax樣本值的累計最大值和累計最小cumprod樣本值的累計積diff計算一階差分(對時間序列很有用)pct_change計算百分?jǐn)?shù)變化匯總和計算描述統(tǒng)計描述和匯總統(tǒng)計(續(xù))76方法 匯總和計算描述統(tǒng)計相關(guān)系數(shù)與協(xié)方差有些匯總統(tǒng)計(如相關(guān)系數(shù)和協(xié)方差)是通過參數(shù)對計算出來的。下面幾個DataFrame數(shù)據(jù)來自Yahoo!Finance的股票價格和成交量:
77>>>importpandas.io.dataasweb>>>all_data={}fortickerin['AAPL','IBM','MSFT','GOOG']:all_data[ticker]=web.get_data_yahoo(ticker,'1/1/2000','1/1/2010')>>>price=DataFrame({tic:data['AdjClose']fortic,datainall_data.iteritems()})>>>volume=DataFrame({tic:data['Volume']fortic,datainall_data.iteritems()})匯總和計算描述統(tǒng)計相關(guān)系數(shù)與協(xié)方差77>>>importp匯總和計算描述統(tǒng)計
接下來計算價格的百分?jǐn)?shù)變化:
Series的corr方法用于計算兩個Series中重疊的、非NA的、按索引對齊的值的相關(guān)系數(shù)。與此類似,cov用干計算協(xié)方差:
78>>>returns=price.pct_change()>>>returns.tail()>>>returns.MSFT.corr(returns.IBM)0.49597970053200319>>>returns.MSFT.cov(returns.IBM)0.00021595764765417841匯總和計算描述統(tǒng)計接下來計算價格的百分?jǐn)?shù)變化:匯總和計算描述統(tǒng)計DataFrame的corr和cov方法將以DataFrame的形式返回完整的相關(guān)系數(shù)或協(xié)方差矩陣:利用DataFrame的corrwith方法,可以計算其列或行跟另一個Series或DataFrame之間的相關(guān)系數(shù)。傳入一個Series將會返回一個相關(guān)系數(shù)值Series(針對各列進(jìn)行計算):79>>>returns.corr()>>>returns.cov()>>>returns.corrwith(returns.IBM)AAPL0.410011GOOG0.390689IBM1.000000MSFT0.495980匯總和計算描述統(tǒng)計DataFrame的c匯總和計算描述統(tǒng)計傳入一個DataFrame則會計算按列名配對的相關(guān)系數(shù)。下面計算了百分比變化與成交量的相關(guān)系數(shù):傳入axis=1即可按行進(jìn)行計算。無論如何,在計算相關(guān)系數(shù)之前,所有的數(shù)據(jù)項都會按標(biāo)簽對齊。80>>>returns.corrwith(volume)AAPL-0.057549GOOG0.062647IBM-0.007892MSFT-0.014245dtype:float64匯總和計算描述統(tǒng)計傳入一個DataFra匯總和計算描述統(tǒng)計唯一值、值計數(shù)以及成員資格還有一類方法可以從一維Series的值中抽取信息。以下面這個Series為例:返回的唯一值是未排序的,如果需要的話,可以對結(jié)果再次進(jìn)行排序(uniques.sort())。value_counts用于計算一個Series中各值出現(xiàn)的頻率:
81>>>obj=Series(['c','a','d','a','a','b','b','c','c'])#函數(shù)是unique,它可以得到Series中的唯一值數(shù)組:>>>uniques=obj.unique()>>>uniquesarray(['c','a','d','b'],dtype=object)匯總和計算描述統(tǒng)計唯一值、值計數(shù)以及成員資格81>>>ob匯總和計算描述統(tǒng)計為了便于査看,結(jié)果Series是按值頻率降序排列的。value_counts還是一個頂級pandas方法,可用于任何數(shù)組或序列:82>>>obj.value_counts()c3a3b2d1dtype:int64>>>pd.value_counts(obj.values,sort=False)a3c3b2d1dtype:int64匯總和計算描述統(tǒng)計82>>>obj.value_count匯總和計算描述統(tǒng)計最后是isin,它用于判斷矢量化集合的成員資格,可用于選取Series中或DataFrame列中數(shù)據(jù)的子集:83>>>mask=obj.isin(['b','c'])>>>mask0True1False2False3False4False5True6True7True8Truedtype:bool>>>obj0c1a2d3a4a5b6b7c8cdtype:object>>>obj[mask]0c5b6b7c8c匯總和計算描述統(tǒng)計最后是isin,它用于判匯總和計算描述統(tǒng)計唯一值、值計數(shù)、成員資格方法84方法說明isin計算一個表示“Series各值是否包含于
傳入的值序列中”的布爾型數(shù)組unique計算Series中的唯一值數(shù)組,按發(fā)現(xiàn)
的順序返回value_counts返回一個Series,其索引為唯一值,其
值為頻率,按計數(shù)值降序排列匯總和計算描述統(tǒng)計唯一值、值計數(shù)、成員資格匯總和計算描述統(tǒng)計85有時,可能希望得到DataFrame中多個相關(guān)列的一張柱狀圖。例如:將pandas.value_counts傳給該DataFrame的apply函數(shù),就會出現(xiàn):>>>data=DataFrame({'Qu1':[1,3,4,3,4],'Qu2':[2,3,1,2,3],'Qu3':[1,5,2,4,4]})>>>data>>>result=data.apply(pd.value_counts).fillna(0)>>>result匯總和計算描述統(tǒng)計85有時,可能希望得到D處理缺失數(shù)據(jù)缺失數(shù)據(jù)(missingdata)在大部分?jǐn)?shù)據(jù)分析應(yīng)用中都很常見。pandas的設(shè)計目標(biāo)之一就是讓缺失數(shù)據(jù)的處理任務(wù)盡量輕松。例如,pandas對象上的所有描述統(tǒng)計都排除了缺失數(shù)據(jù)。pandas使用浮點值NaN(NotaNumber)表示浮點和非浮點數(shù)組中的缺失數(shù)據(jù)。它只是一個便于被檢測出來的標(biāo)記而已:
86>>>string_data=Series(['aardvark','artichoke',np.nan,'avocado'])處理缺失數(shù)據(jù)缺失數(shù)據(jù)(missingda處理缺失數(shù)據(jù)
Python內(nèi)置的None值也會被當(dāng)做NA處理
87>>>string_data[0]=None>>>string_data.isnull()0True1False2True3Falsedtype:bool>>>string_data0aardvark1artichoke2NaN3avocadodtype:object>>>string_data.isnull()0False1False2True3Falsedtype:bool處理缺失數(shù)據(jù)87>>>string_data[0]=N處理缺失數(shù)據(jù)NA處理方法:
88方法 說明dropna 根據(jù)各標(biāo)簽的值中是否存在缺失數(shù)據(jù)對軸標(biāo)
簽進(jìn)行過濾,可通過閾值調(diào)節(jié)對缺失值的容
忍度fillna 用指定值或插值方法(如ffill或bfill)填充缺
失數(shù)據(jù)isnull 返回一個含有布爾值的對象,這些布爾值表
示哪些值是缺失值/NA,該對象的類型與源
類型一樣notnull isnull的否定式處理缺失數(shù)據(jù)NA處理方法:88方法 處理缺失數(shù)據(jù)濾除缺失數(shù)據(jù)過濾掉缺失數(shù)據(jù)的辦法有很多種。純手工操作永遠(yuǎn)都是一個辦法,但dro
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度私人房產(chǎn)全款買賣合同(帶家具家電)
- 二零二五年度兒童樂園加盟經(jīng)營協(xié)議
- 2025年度門面房租賃與物業(yè)管理責(zé)任合同
- 2025年度跨境貿(mào)易合同終止的多種國際法律適用情形
- 人才獵頭服務(wù)與委托協(xié)議書
- 股權(quán)轉(zhuǎn)讓協(xié)議承債
- 智慧城市基礎(chǔ)設(shè)施升級改造合同
- 網(wǎng)絡(luò)教育培訓(xùn)平臺開發(fā)協(xié)議
- 個人生活用品買賣合同
- 數(shù)學(xué)課本中的幾何之旅教案設(shè)計
- 第22課《陳涉世家》課件(共71張)
- 新能源汽車產(chǎn)業(yè)專利分析綜述
- 2010年4月自考00371公安決策學(xué)試題及答案含解析
- 實驗室儀器借用登記表
- 單肺通氣與肺保護(hù)通氣策略護(hù)理課件
- 規(guī)培出科小結(jié)呼吸內(nèi)科
- 《鋼鐵是怎樣煉成的》選擇題100題(含答案)
- 《房地產(chǎn)行政管理》課件
- 北京垃圾分類管理制度
- 人力資源招聘與企業(yè)培訓(xùn)培訓(xùn)資料
- 電工學(xué)(第8版)(上冊 電工技術(shù)) 課件全套 秦曾煌 第1-14章 電路的基本概念與基本定律- 傳感器
評論
0/150
提交評論