版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Python數(shù)據(jù)分析與實(shí)踐12023/10/28第5章異常本章學(xué)習(xí)目標(biāo):?學(xué)習(xí)NumPy庫的用法、數(shù)據(jù)結(jié)構(gòu)和基本操作?學(xué)習(xí)Pandas庫的用法、數(shù)據(jù)結(jié)構(gòu)和基本操作?學(xué)習(xí)Matplotlib庫的用法、數(shù)據(jù)結(jié)構(gòu)和基本操作?掌握SciPy庫的操作、作用?掌握Scikit-learn庫的操作、作用32023/10/285.1NumPy
NumPy(NumericalPython的縮寫)是一個(gè)開源的Python科學(xué)計(jì)算庫,包含很多實(shí)用的數(shù)學(xué)函數(shù),涵蓋線性代數(shù)運(yùn)算、傅里葉變換和隨機(jī)數(shù)生成等功能。NumPy允許用戶進(jìn)行快速的交互式原型設(shè)計(jì),可以很自然地使用數(shù)組和矩陣。42023/10/285.1NumPy它的部分功能如下:(1)ndarray:一個(gè)具有矢量算術(shù)運(yùn)算且節(jié)省空間的多維數(shù)組。(2)用于對(duì)整組數(shù)據(jù)進(jìn)行快速運(yùn)算的標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)(無須編寫循環(huán))。(3)用于讀/寫磁盤數(shù)據(jù)的工具以及用于操作內(nèi)存映射文件的工具。(4)線性代數(shù)、隨機(jī)數(shù)生成以及傅里葉變換功能。(5)用于集成C、C++、Fortran等語言的代碼編寫工具。52023/10/285.1NumPy
NumPy的多維數(shù)組對(duì)象ndarray是一個(gè)快速、靈活的大數(shù)據(jù)集容器。用戶可以利用這種數(shù)組對(duì)象對(duì)整塊數(shù)據(jù)進(jìn)行數(shù)學(xué)運(yùn)算,其運(yùn)算跟標(biāo)量元素之間的運(yùn)算一樣。創(chuàng)建ndarray數(shù)組最簡(jiǎn)單的辦法就是使用array()函數(shù)。它接受一切序列型的對(duì)象(包括其他數(shù)組),然后產(chǎn)生一個(gè)新的、含有傳入數(shù)據(jù)的NumPy數(shù)組。這里以一個(gè)列表的轉(zhuǎn)換為例:In[1]:importnumpyasnpdata=[6,7.5,8,0,1]arr1=np.array(data)arr1Out[1]:array([6.,7.5,8.,0.,1.])62023/10/285.1NumPy
ndarray是一個(gè)通用的同構(gòu)數(shù)據(jù)多維容器,其中所有的元素必須是相同類型的。每一個(gè)數(shù)組都有一個(gè)shape(表示維度大小的數(shù)組)和一個(gè)dtype(用于說明數(shù)組數(shù)據(jù)類型的對(duì)象):In[2]:arr1.shapeOut[2]:(5,)In[3]:arr1.dtypeOut[3]:dtype('float64')72023/10/285.1NumPy
嵌套序列(例如由一組等長(zhǎng)列表組成的列表)將會(huì)被轉(zhuǎn)換成一個(gè)多維數(shù)組:In[4]:data2=[[1,2,3,4],[5,6,7,8]]arr2=np.array(data2)arr2Out[4]:array([[1,2,3,4],[5,6,7,8]])In[5]:arr2.ndimOut[5]:2In[6]:arr2.shapeOut[6]:(2,4)82023/10/285.1NumPy
除非顯式說明,否則np.array()會(huì)嘗試為新建的數(shù)組推斷出一個(gè)較為合適的數(shù)據(jù)類型。數(shù)據(jù)類型保存在一個(gè)特殊的dtype對(duì)象中,例如上面的兩個(gè)例子:In[7]:arr1.dtypeOut[7]:dtype('float64')In[8]:arr2.dtypeOut[8]:dtype('int32')92023/10/285.1NumPy
除了np.array()外,還有一些函數(shù)可以新建數(shù)組,例如np.zeros()和np.ones()可以分別創(chuàng)建指定長(zhǎng)度或形狀的全為0或全為1的數(shù)組。Empty可以創(chuàng)建一個(gè)沒有任何具體數(shù)值的數(shù)組。如果要用這些方法創(chuàng)建數(shù)組,只需傳入一個(gè)表示形狀的元組即可:In[9]:np.zeros(8)Out[9]:array([0.,0.,0.,0.,0.,0.,0.,0.])In[10]:np.zeros((2,4))Out[10]:array([[0.,0.,0.,0.],[0.,0.,0.,0.]])102023/10/285.1NumPyIn[11]:np.empty((2,3,2))Out[11]:array([[[9.78249979e-322,0.00000000e+000],[0.00000000e+000,0.00000000e+000],[0.00000000e+000,0.00000000e+000]],[[0.00000000e+000,0.00000000e+000],[0.00000000e+000,0.00000000e+000],[0.00000000e+000,0.00000000e+000]]])
在NumPy中,np.empty()會(huì)認(rèn)為返回全為0的數(shù)組是不安全的,所以它會(huì)返回一些未初始化的很接近0的隨機(jī)值。112023/10/285.1.1ndarray的數(shù)據(jù)類型In[12]:arr3=np.array([1,2,3],dtype=np.float64)arr3Out[12]:array([1.,2.,3.])In[13]:arr4=np.array([1,2,3],dtype=32)arr4Out[13]:array([1,2,3])
dtype(數(shù)據(jù)類型)是一個(gè)特殊的對(duì)象,它含有ndarray將一塊內(nèi)存解釋為特定數(shù)據(jù)類型所需的信息:122023/10/285.1.1ndarray的數(shù)據(jù)類型
dtype是NumPy如此強(qiáng)大和靈活的原因之一。在多數(shù)情況下,它直接映射到相應(yīng)的機(jī)器表示,這使得“讀/寫磁盤上的二進(jìn)制數(shù)據(jù)流”以及“集成低級(jí)語言代碼”等工作變得更加簡(jiǎn)單。數(shù)值型dtype的命名形式相同:一個(gè)類型名(例如float或int),后面跟一個(gè)用于表示各元素位長(zhǎng)的數(shù)字。標(biāo)準(zhǔn)的雙精度浮點(diǎn)值(即Python中的float對(duì)象)需要占用8字節(jié)(即64位)。因此,該類型在NumPy中記作float64。132023/10/285.1.1ndarray的數(shù)據(jù)類型In[14]:arr5=np.array([1,2,3])arr5.dtypeOut[14]:dtype('int32')In[15]:arr6=arr5.astype(np.float64)arr6Out[15]:array([1.,2.,3.])
可以用astype的方法顯示更改數(shù)組的dtype:142023/10/285.1.2數(shù)組和標(biāo)量之間的運(yùn)算In[16]:arr=np.array([[1.,2.,3.],[4.,5.,6]])arr?arrOut[16]:array([[1.,4.,9.],[16.,25.,36.]])In[17]:arr-arrOut[17]:array([[0.,0.,0.],[0.,0.,0.]])
用數(shù)組表達(dá)式代替循環(huán)的方法,通常被稱作矢量化(vectorization)。大小相等的數(shù)組之間的任何算術(shù)運(yùn)算都會(huì)應(yīng)用到元素集:152023/10/285.1.2數(shù)組和標(biāo)量之間的運(yùn)算In[18]:1/arrOut[18]:array([[1.,0.5,0.33333333],[0.25,0.2,0.16666667]])In[19]:arr??0.5Out[19]:array([[1.,1.41421356,1.73205081],[2.,2.23606798,2.44948974]])
同樣,數(shù)組和標(biāo)量的運(yùn)算也會(huì)將那個(gè)標(biāo)量傳播到各個(gè)元素:162023/10/285.1.3索引和切片
NumPy索引和切片是一個(gè)內(nèi)容豐富的主題,因?yàn)檫x取數(shù)據(jù)子集或單個(gè)元素的方式有很多。首先,一維數(shù)組的切片索引基本和Python列表的切片索引功能一致。172023/10/285.1.3索引和切片In[20]:arr=np.arange(10)arrOut[20]:array([0,1,2,3,4,5,6,7,8,9])In[21]:arr[4]Out[21]:4In[22]:arr[3:7]Out[22]:array([3,4,5,6])In[23]:arr[3:5]=12arrOut[23]:array([0,1,2,12,12,5,6,7,8,9])
如上所示,當(dāng)將一個(gè)標(biāo)量賦值給一個(gè)切片時(shí)(例如arr[3:5]=12),該值會(huì)自動(dòng)傳播到整個(gè)選區(qū)。因?yàn)閿?shù)組切片是原始數(shù)組視圖,這就意味著如果做任何修改,原始都會(huì)跟著更改。182023/10/285.1.3索引和切片In[26]:arr=np.array([[1,2,3],[4,5,6],[7,8,9]])arr[2]Out[26]:array([7,8,9])
對(duì)于高維數(shù)組,能做的事情更多。在一個(gè)二維數(shù)組中,各索引位置上的元素不再是標(biāo)量而是一維數(shù)組:192023/10/285.1.3索引和切片In[27]:arr[1][2]Out[27]:6In[28]:arr[1,2]Out[28]:6
因此,可以對(duì)各個(gè)元素進(jìn)行遞歸訪問,但這樣需要做的事情有點(diǎn)多。用戶可以傳入一個(gè)以逗號(hào)隔開的索引列表來選取單個(gè)元素。也就是說,下面這兩種方式是等價(jià)的:202023/10/285.1.3索引和切片In[29]:arr=np.empty((8,4))foriinrange(8):arr[i]=iarrOut[29]:array([[0.,0.,0.,0.],[1.,1.,1.,1.],[2.,2.,2.,2.],...,[5.,5.,5.,5.],[6.,6.,6.,6.],[7.,7.,7.,7.]])
花式索引是利用整數(shù)數(shù)組進(jìn)行索引,假設(shè)有一個(gè)8×4的數(shù)組:212023/10/285.1.3索引和切片In[30]:arr[[4,3,0,6]]Out[30]:array([[4.,4.,4.,4.],[3.,3.,3.,3.],[0.,0.,0.,0.],[6.,6.,6.,6.]])
為了以特定的順序選取行子集,只需傳入一個(gè)用于指定順序的整數(shù)列表或ndarray即可:222023/10/285.1.3索引和切片In[31]:arr[[-3,-5,-7]]Out[31]:array([[5.,5.,5.,5.],[3.,3.,3.,3.],[1.,1.,1.,1.]])
使用負(fù)數(shù)索引將會(huì)從末尾開始選取行:232023/10/285.1.3索引和切片In[32]:arr=np.arange(32).reshape((8,4))arrOut[32]:array([[0,1,2,3],[4,5,6,7],[8,9,10,11],...,[20,21,22,23],[24,25,26,27],[28,29,30,31]])In[33]:arr[[1,5,7,2],[0,3,1,2]]Out[33]:array([4,23,29,10])
當(dāng)一次傳入多個(gè)數(shù)組時(shí),它返回的是一個(gè)一維數(shù)組,其中的元素對(duì)應(yīng)各個(gè)索引元組:它選出的元素其實(shí)是(1,0)、(5,3)、(7,1)和(2,2)這些位置的元素。這個(gè)花式索引的結(jié)果可能和某些用戶預(yù)測(cè)的不太一樣,選取矩陣的行列子集應(yīng)該是矩形區(qū)域的形式才對(duì)。242023/10/285.1.3索引和切片In[34]:arr[[1,5,7,2]][:,[0,3,1,2]]Out[34]:array([[4,7,5,6],[20,23,21,22],[28,31,29,30],[8,11,9,10]])
下面是得到該結(jié)果的一個(gè)辦法:252023/10/285.1.3索引和切片In[35]:arr[np.ix_([1,5,7,2],[0,3,1,2])]Out[35]:array([[4,7,5,6],[20,23,21,22],[28,31,29,30],[8,11,9,10]])
另外一個(gè)辦法就是使用np.ix_()函數(shù),它可以將兩個(gè)一維數(shù)組轉(zhuǎn)換成一個(gè)用于選取方形區(qū)域的索引器:注意:花式索引和切片不一樣,它是將數(shù)據(jù)復(fù)制到新的數(shù)組中。262023/10/285.1.4數(shù)組轉(zhuǎn)置和軸對(duì)換In[36]:arr=np.arange(15).reshape(5,3)ArrOut[36]:array([[0,1,2],[3,4,5],[6,7,8],[9,10,11],[12,13,14]])In[37]:arr.TOut[37]:array([[0,3,6,9,12],[1,4,7,10,13],[2,5,8,11,14]])
轉(zhuǎn)置(transpose)是重塑的一種特殊形式,它返回的是源數(shù)據(jù)的視圖(不會(huì)進(jìn)行任何復(fù)制操作)。數(shù)組不僅有transpose()方法,還有一個(gè)特殊的T屬性:272023/10/285.1.4數(shù)組轉(zhuǎn)置和軸對(duì)換In[38]:arr=np.random.randn(6,3)np.dot(arr.T,arr)Out[38]:array([[9.03630405,0.49388948,-1.54587135],[0.49388948,2.25164741,1.93791071],[-1.54587135,1.93791071,10.55460651]])
在進(jìn)行矩陣計(jì)算時(shí),經(jīng)常需要用到該操作,例如利用np.dot()計(jì)算矩陣內(nèi)積:282023/10/285.1.4數(shù)組轉(zhuǎn)置和軸對(duì)換In[39]:arr=np.arange(16).reshape((2,2,4))ArrOut[39]:array([[[0,1,2,3],[4,5,6,7]],[[8,9,10,11],[12,13,14,15]]])In[40]:arr.transpose((1,0,2))Out[40]:array([[[0,1,2,3],[8,9,10,11]],[[4,5,6,7],[12,13,14,15]]])
對(duì)于高維數(shù)組,transpose()需要得到一個(gè)由軸編號(hào)組成的元組才能對(duì)這些軸進(jìn)行轉(zhuǎn)置:292023/10/285.1.5利用數(shù)組進(jìn)行數(shù)據(jù)處理In[41]:points=np.arange(-5,5,0.01)#1000個(gè)間隔相等的點(diǎn)xs,ys=np.meshgrid(points,points)ysOut[41]:array([[-5.,-5.,-5.,...,-5.,-5.,-5.],[-4.99,-4.99,-4.99,...,-4.99,-4.99,-4.99],[-4.98,-4.98,-4.98,...,-4.98,-4.98,-4.98],...,[4.97,4.97,4.97,...,4.97,4.97,4.97],[4.98,4.98,4.98,...,4.98,4.98,4.98],[4.99,4.99,4.99,...,4.99,4.99,4.99]])
NumPy數(shù)組可以將很多數(shù)據(jù)處理任務(wù)表述為簡(jiǎn)潔的數(shù)組表達(dá)式(否則需要編寫循環(huán))。矢量化數(shù)組運(yùn)算要比Python方式快上一兩個(gè)數(shù)量級(jí),尤其是對(duì)于各種數(shù)值運(yùn)算。例如np.meshgrid()函數(shù)接受兩個(gè)一維數(shù)組,并產(chǎn)生兩個(gè)二維矩陣(對(duì)應(yīng)兩個(gè)數(shù)組中所有的(x,y)對(duì))。302023/10/285.1.5利用數(shù)組進(jìn)行數(shù)據(jù)處理In[42]:importmatplotlib.pyplotaspltz=np.sqrt(xs??2+ys??2)
假設(shè)在一組值上計(jì)算函數(shù)sqrt(x^2+y^2),這時(shí)對(duì)函數(shù)的求值運(yùn)算就好辦了,把這兩個(gè)數(shù)組當(dāng)作兩個(gè)浮點(diǎn)數(shù)編寫表達(dá)式即可:312023/10/285.1.5利用數(shù)組進(jìn)行數(shù)據(jù)處理zOut[42]:array([[7.07106781,7.06400028,7.05693985,...,7.04988652,7.05693985,7.06400028],[7.06400028,7.05692568,7.04985815,...,7.04279774,7.04985815,7.05692568],[7.05693985,7.04985815,7.04278354,...,7.03571603,7.04278354,7.04985815],...,[7.04988652,7.04279774,7.03571603,...,7.0286414,7.03571603,7.04279774],[7.05693985,7.04985815,7.04278354,...,7.03571603,7.04278354,7.04985815],[7.06400028,7.05692568,7.04985815,...,7.04279774,7.04985815,7.05692568]])322023/10/285.1.5利用數(shù)組進(jìn)行數(shù)據(jù)處理In[43]:plt.imshow(z,cmap=plt.cm.gray)plt.colorbar()plt.title('Imageplotof$\sqrt{x^2+y^2}$foragridofvalues')Out[43]:matplotlib.text.Textat0x1086aa90332023/10/285.1.6數(shù)學(xué)和統(tǒng)計(jì)方法
用戶可以通過數(shù)組上的一組數(shù)學(xué)函數(shù)對(duì)整個(gè)數(shù)組或某個(gè)軸向的數(shù)據(jù)進(jìn)行統(tǒng)計(jì)計(jì)算。In[44]:arr=np.random.randn(5,4)#產(chǎn)生正態(tài)分布數(shù)據(jù)arr.mean()Out[44]:-0.24070480645161735In[45]:np.mean(arr)Out[45]:-0.24070480645161735In[46]:arr.sum()Out[46]:-4.8140961290323467342023/10/285.1.6數(shù)學(xué)和統(tǒng)計(jì)方法
mean()和sum()這類函數(shù)可以接受一個(gè)axis參數(shù)(用于計(jì)算該軸向上的統(tǒng)計(jì)值),最終結(jié)果是一個(gè)少一維的數(shù)組:In[47]:arr.mean(axis=1)Out[47]:array([-0.26271711,-0.50185429,0.38508322,-0.25435201,-0.56968384])In[48]:arr.sum(0)Out[48]:array([0.81837351,-2.17245972,-4.01616748,0.55615755])352023/10/285.1.6數(shù)學(xué)和統(tǒng)計(jì)方法
像cumsum()和cumprod()之類的方法則不聚合,而是產(chǎn)生一個(gè)由中間結(jié)果組成的數(shù)組:In[49]:arr=np.array([[0,1,2],[3,4,5],[6,7,8]])arr.cumsum(0)Out[49]:array([[0,1,2],[3,5,7],[9,12,15]],dtype=int32)In[50]:arr.cumprod(1)Out[50]:array([[0,0,0],[3,12,60],[6,42,336]],dtype=int32)362023/10/285.2Pandas
Pandas的名稱來自于面板數(shù)據(jù)(paneldata)和Python數(shù)據(jù)分析(dataanalysis),Pandas是一種基于NumPy的數(shù)據(jù)分析包,最初由AQRCapitalManagement于2008年4月作為金融數(shù)據(jù)分析工具開發(fā)出來,并于2009年底開源,目前由專注于Python數(shù)據(jù)包開發(fā)的PyData開發(fā)小組繼續(xù)維護(hù)。Pandas提供了大量的高效操作大型數(shù)據(jù)集所需的函數(shù)和方法,它是使Python成為強(qiáng)大而高效的數(shù)據(jù)分析工具的重要因素之一。372023/10/285.2.1Pandas數(shù)據(jù)結(jié)構(gòu)
Series是一種類似于一維數(shù)組的對(duì)象,它由一組數(shù)據(jù)及與之相關(guān)的一組數(shù)據(jù)標(biāo)簽(即索引)組成。只有一組數(shù)據(jù)可產(chǎn)生最簡(jiǎn)單的Series:1.SeriesIn[1]:importpandasaspdfrompandasimportSeries,DataFrameobj=Series([4,7,-5,3])objOut[1]:04172-533dtype:int64382023/10/285.2.1Pandas數(shù)據(jù)結(jié)構(gòu)
Series的字符串表現(xiàn)形式為索引在左邊,值在右邊。由于沒有為數(shù)據(jù)指定索引,會(huì)自動(dòng)創(chuàng)建一個(gè)0~N-1(N為數(shù)據(jù)長(zhǎng)度)的整數(shù)型索引。用戶可以通過Series的values和index屬性獲取其數(shù)組表示形式和索引對(duì)象:1.SeriesIn[2]:obj.valuesOut[2]:array([4,7,-5,3],dtype=int64)In[3]:obj.indexOut[3]:RangeIndex(start=0,stop=4,step=1)392023/10/285.2.1Pandas數(shù)據(jù)結(jié)構(gòu)
通常,需要?jiǎng)?chuàng)建的Series帶有一個(gè)可以對(duì)各個(gè)數(shù)據(jù)點(diǎn)進(jìn)行標(biāo)記的索引:1.SeriesIn[4]:obj2=Series([4,3,-5,7],index=['d','b','a','c'])obj2Out[4]:d4b3a-5c7dtype:int64402023/10/285.2.1Pandas數(shù)據(jù)結(jié)構(gòu)
與普通的NumPy數(shù)組相比,可以通過索引的方式選取Series中的單個(gè)或一組值:1.SeriesIn[5]:obj2['a']Out[5]:-5In[6]:obj2[['c','a','d']]Out[6]:c7a-5d4dtype:int64412023/10/285.2.1Pandas數(shù)據(jù)結(jié)構(gòu)
DataFrame是一個(gè)表格型的數(shù)據(jù)結(jié)構(gòu),它含有一組有序的列,每列可以是不同的類型(數(shù)值型、字符串、布爾型等)。DataFrame既有行索引,又有列索引,可以看作是由Series組成的字典(共用同一個(gè)索引)。跟其他類似的數(shù)據(jù)結(jié)構(gòu)相比,DataFrame中面向行和面向列的操作基本是平衡的。2.DataFrame422023/10/285.2.1Pandas數(shù)據(jù)結(jié)構(gòu)
構(gòu)建DataFrame的方法很多,最常見的就是直接傳入一個(gè)由等長(zhǎng)列表或NumPy數(shù)組組成的字典:2.DataFrameIn[7]: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)frameOut[7]:popstateyear01.5Ohio200011.7Ohio200123.6Ohio200232.4Nevada200142.9Nevada2002432023/10/285.2.1Pandas數(shù)據(jù)結(jié)構(gòu)
如果指定了列序列,DataFrame的列就會(huì)按照指定的順序進(jìn)行排列:2.DataFrameIn[8]:DataFrame(data,columns=['year','state','pop'])Out[8]:yearstatepop02000Ohio1.512001Ohio1.722002Ohio3.632001Nevada2.442002Nevada2.9442023/10/285.2.2Pandas文件操作
Pandas提供了一些用于將表格型數(shù)據(jù)讀取為DataFrame對(duì)象的函數(shù)。其中read_csv()和read_table()可能會(huì)是今后用得最多的。1.Pandas讀取文件452023/10/285.2.3數(shù)據(jù)處理
在數(shù)據(jù)分析中,數(shù)據(jù)清洗是數(shù)據(jù)價(jià)值鏈中最關(guān)鍵的步驟。數(shù)據(jù)清洗就是處理缺失數(shù)據(jù)以及清除無意義的信息。對(duì)于垃圾數(shù)據(jù),即使是通過最好的分析,也將產(chǎn)生錯(cuò)誤的結(jié)果,并誤導(dǎo)業(yè)務(wù)本身。462023/10/285.2.3數(shù)據(jù)處理In[9]:importpandasaspdimportnumpyasnpfrompandasimportDataFramedata={'Tom':[170,26,30],'Mike':[175,25,28],'Jane':[170,26,np.nan],'Tim':[175,25,28]}data1=DataFrame(data).Tdata1.drop_duplicates()data1
對(duì)缺失值的處理有數(shù)據(jù)補(bǔ)齊、刪除對(duì)應(yīng)行、不處理等幾種方法。例如:472023/10/285.2.3數(shù)據(jù)處理Out[9]:012Jane170.026.0NaNMike175.025.028.0Tim175.025.028.0Tom170.026.030.0
該段代碼的輸出結(jié)果如下:482023/10/285.2.3數(shù)據(jù)處理In[10]:data2=data1.dropna()data2
方法一:刪除有缺失值的行。492023/10/285.2.3數(shù)據(jù)處理Out[10]:012Mike175.025.028.0Tim175.025.028.0Tom170.026.030.0
刪除后的結(jié)果如下:
通過使用dropna()方法后,可以看到第1行存在缺失值,故被刪掉了。502023/10/285.2.3數(shù)據(jù)處理In[11]:data3=data1.fillna(data1.mean())data3
方法二:對(duì)缺失值進(jìn)行填充有很多方法,比較常用的有均值填充、中位數(shù)填充、眾數(shù)填充等。以下采用均值填充:512023/10/285.2.3數(shù)據(jù)處理Out[11]:012Jane170.026.028.666667Mike175.025.028.000000Tim175.025.028.000000Tom170.026.030.000000
結(jié)果為:522023/10/285.2.4層次化索引In[12]:importpandasaspdimportnumpyasnpfrompandasimportSeries,DataFramedata=Series(np.random.randn(10),index=[['a','a','a','b','b','b','c','c','d','d'],[1,2,3,1,2,3,1,2,2,3]])
層次化索引是Pandas的一個(gè)重要功能,它能使一個(gè)軸上有多個(gè)(兩個(gè)以上)索引級(jí)別,即它能以低維度形式處理高維度數(shù)據(jù)。532023/10/285.2.4層次化索引dataOut[12]:a1-0.08859420.31661131.383978b10.2155102-0.1119133-0.580355c1-0.0480502-0.054285d2-0.1368603-1.578472dtype:float64542023/10/285.2.4層次化索引In[13]:data.indexOut[13]:MultiIndex(levels=[['a','b','c','d'],[1,2,3]],labels=[[0,0,0,1,1,1,2,2,3,3],[0,1,2,0,1,2,0,1,1,2]])
這就是帶有多重索引的Series格式化輸出。下面看一下它的索引:552023/10/285.2.4層次化索引In[14]:data['b']Out[14]:10.2155102-0.1119133-0.580355In[15]:data['b':'c']Out[15]:b10.2155102-0.1119133-0.580355對(duì)于一個(gè)層次化索引的對(duì)象,選取一個(gè)數(shù)據(jù)集很簡(jiǎn)單:c1-0.0480502-0.054285dtype:float6In[16]:data[['b','d']]Out[16]:b10.2155102-0.1119133-0.580355d2-0.1368603-1.578472dtype:float6562023/10/285.2.4層次化索引In[17]:data[:,2]Out[17]:a0.316611b-0.111913c-0.054285d-0.136860dtype:float64甚至還可以在“內(nèi)層”中進(jìn)行選取:572023/10/285.2.4層次化索引In[18]:data.unstack()Out[18]:123a-0.0885940.3166111.383978b0.215510-0.111913-0.580355c-0.048050-0.054285NaNdNaN-0.136860-1.578472
層次化索引在數(shù)據(jù)重塑和基于分組的操作中扮演著重要的角色。例如,一個(gè)數(shù)據(jù)可以通過它的unstack()方法被重新安排到一個(gè)DataFrame中:582023/10/285.2.4層次化索引In[19]:df=DataFrame(np.arange(12).reshape((4,3)),index=[['a','a','b','b'],[1,2,1,2]],columns=[['Ohio','Ohio','Colorado'],['green','red','green']])DfOut[19]:OhioColoradogreenredgreena10122345b1678291011對(duì)于一個(gè)DataFrame對(duì)象,每條軸都可以有分層索引:592023/10/285.2.4層次化索引In[20]:s=['key1','key2']s=['state','color']dfOut[20]:stateOhioColoradocolorgreenredgreenkey1key2a10122345b1678291011
各層都可以有名字(字符串或者其他Python對(duì)象)。如果指定名稱,它就會(huì)顯示在控制臺(tái)輸出中:602023/10/285.2.4層次化索引In[21]:df['Ohio']Out[21]:colorgreenredkey1key2a101234b1672910
由于有了分部的索引,所以可以很輕松地選取列分組:612023/10/285.2.5分級(jí)順序In[22]:df.swaplevel('key1','key2')Out[22]:stateOhioColoradocolorgreenredgreenkey2key11a0122a3451b6782b91011
由于有了分部的索引,所以可以很輕松地選取列分組:1.重新分級(jí)排序622023/10/285.2.5分級(jí)順序In[23]:df.sortlevel(1)Out[23]:stateOhioColoradocolorgreenredgreenkey1key2a1012b1678a2345b291011
在交換級(jí)別時(shí)經(jīng)常會(huì)用到sortlevel(),sortlevel()根據(jù)單個(gè)級(jí)別中的值對(duì)數(shù)據(jù)進(jìn)行排序,這樣最終結(jié)果就是有序的了:1.重新分級(jí)排序632023/10/285.2.5分級(jí)順序In[24]:df.sum(level='key2')Out[24]:stateOhioColoradocolorgreenredgreenkey2168102121416
許多對(duì)DataFrame和Series的描述和匯總統(tǒng)計(jì)都有一個(gè)level選項(xiàng),它用于指定在某條軸上求和的級(jí)別。例如:2.根據(jù)級(jí)別匯總統(tǒng)計(jì)642023/10/285.2.6使用DataFrame的列
有時(shí)希望將DataFrame的一個(gè)或多個(gè)列索引當(dāng)成行用,或者將DataFrame的行索引變成列。In[25]:Df=DataFrame({'a':range(7),'b':range(7,0,-1),'c':['one','one','one','two','two','two','two'],'d':[0,1,2,0,1,2,3]})DfOut[25]:abcd007one0116one1225one2334two0443two1552two2661two3652023/10/285.2.6使用DataFrame的列
DataFrame的set_index()方法會(huì)將一個(gè)或多個(gè)列轉(zhuǎn)化成行索引,并創(chuàng)建一個(gè)新的DataFrame:In[26]:df1=df.set_index(['c','d'])df1Out[26]:abcdone007116225two034143252361662023/10/285.2.6使用DataFrame的列
DataFrame的reset_index()方法會(huì)將層次化索引的級(jí)別轉(zhuǎn)移到列里面去:In[27]:df1.reset_index()Out[27]:cdab0one0071one1162one2253two0344two1435two2526two361672023/10/285.3Matplotlib
Matplotlib可以通過繪圖幫助用戶找出異常值,進(jìn)行必要的數(shù)據(jù)轉(zhuǎn)換,得出有關(guān)模型的idea等,是Python數(shù)據(jù)分析重要的可視化工具。682023/10/285.3.1figure和subplot
Matplotlib的圖像都位于figure中,可以用plt.figure()創(chuàng)建一個(gè)新的figure:In[28]:importmatplotlib.pyplotaspltfig=plt.figure()#創(chuàng)建一個(gè)新的figure,會(huì)彈出一個(gè)空窗口692023/10/285.3.1figure和subplot
plt.figure()的一些選項(xiàng),特別是figuresize,可以確保圖片保存到磁盤上時(shí)具有一定的大小和縱橫比。plt.gcf()可得到當(dāng)前figure的引用,必須用add_subplot()創(chuàng)建一個(gè)或多個(gè)subplot才可以繪圖:In[29]:ax1=fig.add_subplot(2,2,1)
以上代碼的意思是該圖像是2×2的(即有4個(gè)subplot),且當(dāng)前選中的是4個(gè)subplot中的第一個(gè)(編號(hào)從1開始)。如果要把后面的也創(chuàng)建并顯示出來,可以用如下代碼:702023/10/285.3.1figure和subplotIn[30]:ax2=fig.add_subplot(2,2,2)ax3=fig.add_subplot(2,2,3)ax4=fig.add_subplot(2,2,4)712023/10/285.3.1figure和subplotIn[31]:fromnumpy.randomimportrandnplt.plot(randn(50).cumsum(),'k--')
這時(shí)如果執(zhí)行一條繪圖命令plt.plot([]),Matplotlib就會(huì)在最后一個(gè)用過的subplot(沒有則創(chuàng)建一個(gè))上進(jìn)行繪制。
'k--'是一個(gè)線型選項(xiàng),用于告訴Matplotlib繪制黑色虛線圖。前面那些由fig.add_subplot()返回的是AxesSubplot對(duì)象,直接調(diào)用其實(shí)例方法就可以在其他空著的格子里面繪圖:In[32]:importnumpyasnpax1.hist(randn(100),bins=20,color='k',alpha=0.3)ax2.scatter(np.arange(30),np.arange(30)+3?randn(30))722023/10/285.3.1figure和subplotIn[33]:fig,axes=plt.subplots(2,3)axes
可以在Matplotlib中找到各種圖標(biāo)類型。根據(jù)特定布局創(chuàng)建figure和subplot是一件非常常見的任務(wù),于是便出現(xiàn)了一個(gè)更為方便的方法———plt.subplots()。它可以創(chuàng)建一個(gè)新的figure,并返回一個(gè)含有已創(chuàng)建的subplot對(duì)象的NumPy數(shù)組:732023/10/285.3.1figure和subplotOut[33]:array([[matplotlib.axes._subplots.AxesSubplotobjectat0x0000000012486278,matplotlib.axes._subplots.AxesSubplotobjectat0x0000000013EFF780,matplotlib.axes._subplots.AxesSubplotobjectat0x00000000161A67B8],[matplotlib.axes._subplots.AxesSubplotobjectat0x00000000161FF588,matplotlib.axes._subplots.AxesSubplotobjectat0x0000000016265AC8,matplotlib.axes._subplots.AxesSubplotobjectat0x00000000162BE400]],dtype=object)
輸出結(jié)果為:742023/10/285.3.1figure和subplot
這是非常實(shí)用的,因?yàn)榭梢暂p松地對(duì)axes數(shù)組進(jìn)行索引,就好像一個(gè)二維數(shù)組一樣,例如axes[0,1]。用戶還可以通過sharex和sharey指定subplot應(yīng)該具有相同的X軸或Y軸。在比較相同范圍內(nèi)的數(shù)據(jù)時(shí),這也是非常實(shí)用的,否則Matplotlib會(huì)自動(dòng)縮放各圖表的界限。752023/10/285.3.2調(diào)整subplot周圍的間距
在默認(rèn)情況下,Matplotlib會(huì)在subplot外圍留下一定的邊距,并在subplot之間留下一定的間距。間距跟圖像的高度和寬度有關(guān),因此,如果調(diào)整了圖像大小,間距也會(huì)自動(dòng)調(diào)整。利用figure的subplots_adjust()方法可以輕而易舉地修改間距,代碼如下:In[34]:fig,axes=plt.subplots(2,2,sharex=True,sharey=True)foriinrange(2):forjinrange(2):axes[i,j].hist(randn(500),bins=50,color='k',alpha=0.5)plt.subplots_adjust(wspace=0,hspace=0)
wspace和hspace用于控制寬度和高度的百分比,可以用作subplots之間的間距,在這個(gè)例子中將間距收縮到0。762023/10/285.3.3顏色、標(biāo)記和線型
Matplotlib的plot()函數(shù)可以接受一組(x,y)坐標(biāo)以及表示顏色和線型的字符串縮寫。常用的顏色都有一個(gè)縮寫詞,如果要使用其他顏色,可以使用指定其RGB值的方式。例如要根據(jù)x和y繪制紅色虛線,可以執(zhí)行如下代碼:In[35]:plt.plot(x,y,'r--')
這種在一個(gè)字符串中指定顏色和線型的方式非常方便,也可以通過下面這種更為明確的方式得到同樣的效果:In[36]:plt.plot(x,y,linestyle='--',color='r')772023/10/285.3.4刻度標(biāo)簽和圖例
對(duì)于大多數(shù)的圖標(biāo)裝飾項(xiàng)而言,其實(shí)現(xiàn)方式主要有兩種,即使用過程型的pyplot接口和更為面向?qū)ο蟮脑鶰atplotlibAPI。設(shè)計(jì)pyplot接口的目的就是實(shí)現(xiàn)交互式作用,它含有諸如xlim()、xticks()和xticklabels()之類的方法,分別控制圖表的范圍、刻度位置和刻度標(biāo)簽等。其使用方式有以下兩種:(1)調(diào)用時(shí)不帶參數(shù),則返回當(dāng)前的參數(shù)值。例如,plt.xlim()返回當(dāng)前X軸的繪圖范圍。(2)調(diào)用時(shí)帶參數(shù),則設(shè)置參數(shù)。例如,plt.xlim([0,100])會(huì)將X軸的范圍設(shè)置為0~100。782023/10/285.3.4刻度標(biāo)簽和圖例
如果要修改X軸刻度,最簡(jiǎn)單的辦法是使用set_xticks()和set_xticklabels()。前者告訴Matplotlib要將刻度放在數(shù)據(jù)范圍中的哪些位置,在默認(rèn)情況下這些位置也就是刻度標(biāo)簽。792
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版南雄市農(nóng)村集體資產(chǎn)租賃合同3篇
- 二零二五年度國際商務(wù)培訓(xùn)項(xiàng)目聘用專家合同3篇
- 2025年度二零二五綠色建筑設(shè)計(jì)與施工合同樣本4篇
- 二零二五年度木材加工鋼材買賣居間合同附帶鋼材加工行業(yè)標(biāo)準(zhǔn)制定4篇
- 二零二五年度天然氣運(yùn)輸與新能源開發(fā)合同書
- 二零二五年度企業(yè)員工職業(yè)發(fā)展路徑規(guī)劃合同
- 2025年度棉布市場(chǎng)調(diào)研與銷售策略制定合同
- 2025年智能家居內(nèi)墻裝飾施工與智能化升級(jí)合同
- 2025年度個(gè)人購房擔(dān)保借款合同優(yōu)化版2篇
- 氨吸收塔的設(shè)計(jì)
- 中央2025年國務(wù)院發(fā)展研究中心有關(guān)直屬事業(yè)單位招聘19人筆試歷年參考題庫附帶答案詳解
- 2024年09月北京中信銀行北京分行社會(huì)招考(917)筆試歷年參考題庫附帶答案詳解
- 外呼合作協(xié)議
- 小學(xué)二年級(jí)100以內(nèi)進(jìn)退位加減法800道題
- 保險(xiǎn)公司2025年工作總結(jié)與2025年工作計(jì)劃
- 2024年公司領(lǐng)導(dǎo)在新年動(dòng)員會(huì)上的講話樣本(3篇)
- 眼科護(hù)理進(jìn)修專題匯報(bào)
- 介入手術(shù)室感染控制管理
- 2024北京初三(上)期末英語匯編:材料作文
- 2024年大型風(fēng)力發(fā)電項(xiàng)目EPC總承包合同
- 禮儀服務(wù)合同三篇
評(píng)論
0/150
提交評(píng)論