第17章 Python數(shù)據(jù)分析_第1頁
第17章 Python數(shù)據(jù)分析_第2頁
第17章 Python數(shù)據(jù)分析_第3頁
第17章 Python數(shù)據(jù)分析_第4頁
第17章 Python數(shù)據(jù)分析_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第17章Python數(shù)據(jù)分析主講夏敏捷計算機學(xué)院副教授PythonDataAnalysisLibrary(Pandas)PythonDataAnalysisLibrary(Pandas)是基于NumPy的一種工具,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的。Pandas提供了一些標(biāo)準(zhǔn)的數(shù)據(jù)模型和大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法,使Python成為大型數(shù)據(jù)集強大而高效的數(shù)據(jù)分析工具。本章就來學(xué)習(xí)Pandas操作方法。Pandas提供如下數(shù)據(jù)類型:(1)Series系列(Series)是能夠保存任何類型的數(shù)據(jù)(整數(shù),字符串,浮點數(shù),Python對象等)的一維標(biāo)記數(shù)組。

(2)DataFrame數(shù)據(jù)框(DataFrame)是二維的表格型數(shù)據(jù)結(jié)構(gòu)。很多功能與R中的data.frame類似。可以將DataFrame理解為Series的容器。(3)Panel面板(Panel)是三維的數(shù)組,可以理解為DataFrame的容器。17.1PythonDataAnalysisLibrary(Pandas)2.使用Pandas首先需要安裝,在命令行下使用pip3installpandas即可。Pandas約定俗成的導(dǎo)入方法如下:importpandasaspdfrompandasimportSeries,DataFrame如果能導(dǎo)入成功,說明安裝成功。17.1PythonDataAnalysisLibrary

(Pandas)17.1.1Series系列1.創(chuàng)建Pandas系列Series就如同列表一樣是一系列數(shù)據(jù),每個數(shù)據(jù)對應(yīng)一個索引值。可以看做一個定長的有序字典。s=Series(['中國','美國','日本']) #注意這里是默認(rèn)索引0,1,2s=Series(['中國','美國','日本'],index=['a','b','c'])

#自定義索引s=Series(data=['中國','美國','日本'],index=['a','b','c'])Pandas系列可以使用以下構(gòu)造函數(shù)創(chuàng)建:pandas.Series(data,index,dtype,copy)17.1.1Series系列2.訪問Pandas系列(1)使用位置訪問Pandas系列中數(shù)據(jù)s=pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])print(s[0])#訪問第一個元素1print(s[:3])#檢索系列中的前三個元素1,2,3print(s[-3:])#檢索系列中的最后三個元素3,4,5(2)使用索引訪問Pandas系列中數(shù)據(jù)系列Series就像一個固定大小的字典,可以通過索引標(biāo)簽獲取和設(shè)置值。s=pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])print(s['b'])#結(jié)果是2print(s[['a','c','d']])#獲取索引a,c,d對應(yīng)值17.1.2DataFrame數(shù)據(jù)框(DataFrame)是二維數(shù)據(jù)結(jié)構(gòu),即數(shù)據(jù)以行和列的表格方式排列。基本上可以把DataFrame看成是共享同一個index索引的Series的集合。構(gòu)造函數(shù)創(chuàng)建pandas.DataFrame(data,index,columns,dtype,copy)17.1.2DataFrame1.從單個列表創(chuàng)建DataFrameimportpandasaspddata=[10,20,30,40,50]df=pd.DataFrame(data)print(df)2.從多維列表創(chuàng)建DataFrameimportpandasaspddata=[['Alex',10],['Bob',12],['Clarke',13]]df=pd.DataFrame(data,columns=['Name','Age'])print(df)17.1.2DataFrame(3)從鍵值為ndarrays/Lists的字典來創(chuàng)建importpandasaspddata={'Name':['Tom','Jack','Steve','Ricky'],'Age':[28,34,29,42]}df=pd.DataFrame(data)print(df)(4)從系列Series的字典來創(chuàng)建importpandasaspdd={'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['a','b','c','d'])}df=pd.DataFrame(d)print(df)DataFrame的基本功能DataFrame的基本功能>>>importpandasaspd>>>df=pd.read_csv("marks2.csv")#marks2.csv是成績信息>>>

df.T#DataFrame的轉(zhuǎn)置。實現(xiàn)行和列將交換DataFrame的基本功能head()和tail()要查看DataFrame對象的部分?jǐn)?shù)據(jù),可使用head()和tail()方法。head()返回前n行(默認(rèn)數(shù)量為5)。tail()返回最后n行(默認(rèn)數(shù)量為5)。但可以傳遞自定義的行數(shù)。DataFrame的行列操作(1)選擇列通過列名從數(shù)據(jù)框(DataFrame)中選擇一列importpandasaspdd={'one':pd.Series([11,12,13],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['a','b','c','d'])}df=pd.DataFrame(d)print(df['one'])#選擇'one'列DataFrame的行列操作(2)添加列importpandasaspdd={'one':pd.Series([11,12,13],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['a','b','c','d'])}df=pd.DataFrame(d)print("AddinganewcolumnbypassingasSeries:")df['three']=pd.Series([10,20,30],index=['a','b','c'])print("AddinganewcolumnusingtheexistingcolumnsinDataFrame:")df['four']=df['one']+df['three']DataFrame的行列操作(3)刪除列importpandasaspdd={'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['a','b','c','d']),'three':pd.Series([10,20,30],index=['a','b','c'])}df=pd.DataFrame(d)#使用DEL刪除功能deldf['one']#刪除one列#使用POP刪除功能df.pop('two')#刪除two列print(df)DataFrame的行列操作(4)行選擇,添加和刪除可以通過將行標(biāo)簽傳遞給loc()函數(shù)來選擇行。importpandasaspdd={'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['a','b','c','d'])}df=pd.DataFrame(d)print(df.loc['b'])也可以通過將行號傳遞給iloc()函數(shù)來選擇行。print(df.iloc[2])#注意行號是零開始,所以實際是第3行也可以進(jìn)行行切片,使用:運算符選擇多行。print(df[2:4])#選擇第3行到第4行DataFrame的行列操作(5)添加行#使用append()函數(shù)將新行添加到DataFrame中。

importpandasaspd

df=pd.DataFrame([[1,2],[3,4]],columns=['a','b'])

df2=pd.DataFrame([[5,6],[7,8]],columns=['a','b'])

df=df.append(df2)

print(df)DataFrame的行列操作(6)刪除行使用索引標(biāo)簽從DataFrame中刪除或刪除行。如果標(biāo)簽重復(fù),則會刪除多行。importpandasaspddf=pd.DataFrame([[1,2],[3,4]],columns=['a','b'])df2=pd.DataFrame([[5,6],[7,8]],columns=['a','b'])df=df.append(df2)print(df)print('Droprowswithlabel0')df=df.drop(0)print(df)17.2Pandas統(tǒng)計功能DataFrame有很多函數(shù)用來計算描述性統(tǒng)計信息和其他相關(guān)操作。1.描述性統(tǒng)計描述性統(tǒng)計又叫統(tǒng)計分析,一般統(tǒng)計某個變量的平均值、標(biāo)準(zhǔn)偏差、最小值、最大值、以及1/4中位數(shù),1/2中位數(shù),3/4中位數(shù)。表17-4列出Pandas中主要的描述性統(tǒng)計信息的函數(shù)。17.2Pandas統(tǒng)計功能2.匯總DataFrame列數(shù)據(jù)describe()函數(shù)是用來計算有關(guān)DataFrame列的統(tǒng)計信息的摘要。包括數(shù)量count,平均值mean,標(biāo)準(zhǔn)偏差std,最小值min,最大值max,以及1/4中位數(shù),1/2中位數(shù),3/4中位數(shù)。17.2.2分組統(tǒng)計Pandas有多種方式來分組(GroupBy),如:obj.groupby(‘key’)obj.groupby([‘key1’,’key2’])obj.groupby(key,axis=1)例如:importpandasaspddf=pd.DataFrame([[199901,'張海','男',100,100,25,72],[199902,'趙大強','男',95,54,44,88],[199903,'李梅','女',54,76,13,91],[199904,'吉建軍','男',89,78,26,100]],columns=['xuehao','name','sex','physics','python','math','english'])grouped=df.groupby('sex')#按性別分組print(grouped.get_group('男'))17.3Pandas合并/連接和排序Pandas具有功能全面的高性能內(nèi)存中連接操作,與SQL關(guān)系數(shù)據(jù)庫非常相似。Pandas提供了一個merge()函數(shù),實現(xiàn)DataFrame對象之間所有標(biāo)準(zhǔn)數(shù)據(jù)庫連接操作。merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True)合并/連接importpandasaspd

left=pd.DataFrame({

'id':[1,2,3,4,5],

'Name':['Alex','Amy','Allen','Alice','Ayoung'],

'subject_id':['sub1','sub2','sub4','sub6','sub5']})

right=pd.DataFrame(

{'id':[1,2,3,4,5],

'Name':['Billy','Brian','Bran','Bryce','Betty'],

'subject_id':['sub2','sub4','sub3','sub6','sub5']})

#'id'列用作鍵合并兩個數(shù)據(jù)框。

print("'id'列用作鍵合并兩個數(shù)據(jù)框")

rs=pd.merge(left,right,on='id')

print(rs)

合并/連接rs=pd.merge(left,right,on='subject_id',how='left')print(rs)

合并/連接rs=pd.merge(left,right,on='subject_id',how=‘inner')print(rs)

rs=pd.merge(left,right,on='subject_id',how='outer')print(rs)17.3.2排序和排名根據(jù)條件對Series對象或DataFrame對象的值排序(sorting)和排名(ranking)是Pandas一種重要的內(nèi)置運算。Series對象或DataFrame對象可以使用sort_index()/sort_values()函數(shù)進(jìn)行排序,使用rank()函數(shù)進(jìn)行排名。Series的排序Series的sort_index()排序函數(shù),對Series的索引進(jìn)行排序,默認(rèn)是升序importpandasaspds=pd.Series([10,20,33],index=["a","c","b"])#定義一個Seriesprint(s.sort_index())#對Series的索引進(jìn)行排序,默認(rèn)是升序print(s.sort_index(ascending=False))#ascending=False是降序排序?qū)eries不僅可以按索引(標(biāo)簽)進(jìn)行排序,還可以使用sort_values()函數(shù)按值排序。print(s.sort_values(ascending=False))#ascending=False是降序排序DataFrame的排序DataFrame的sort_index()排序函數(shù)使用sort_index()方法,可以對DataFrame進(jìn)行排序。默認(rèn)情況下,按照升序?qū)π兴饕?biāo)簽)進(jìn)行排序。importpandasaspddf=pd.DataFrame([[199901,'張海','男',100,100,25,72],[199902,'趙大強','男',95,54,44,88],[199903,'李梅','女',54,76,13,91],[199904,'吉建軍','男',89,78,26,100]],columns=['xuehao','name','sex','physics','python','math','english'],

index=[1,4,6,2])如果希望按某列的值排序,例如'english'的成績排序可使用by參數(shù)。sorted_df=df.sort_index(by='english')#按列的值排序(不提倡)sorted_df2=df.sort_values(by='english')#按列的值排序print(sorted_df2)排名(ranking)rank(method="average",ascending=True)method參數(shù)值first按值在原始數(shù)據(jù)中的出現(xiàn)順序分配排名,還有min使用整個分組的最小排名,max是用整個分組的最大排名,average使用平均排名,也是默認(rèn)的排名方式。還可以設(shè)置ascending參數(shù),設(shè)置降序還是升序排序。importpandasaspds=pd.Series([1,3,2,1,6],index=["a","c","d","b","e"])print(s.rank())#默認(rèn)是根據(jù)值的大小進(jìn)行平均排名print(s.rank(method="first"))17.4Pandas篩選和過濾功能Pandas的邏輯篩選功能比較簡單,直接在方括號里輸入邏輯運算符即可。假設(shè)數(shù)據(jù)框如下:importpandasaspddf=pd.DataFrame([[199901,'張海','男',100,100,95,72],[199902,'趙大強','男',95,54,44,88],[199903,'李梅','女',54,76,13,91],[199904,'吉建軍','男',89,78,26,100]],columns=['xuehao','name','sex','physics','python','math','english'],index=[1,4,6,2])df1=df[(df.math>80)&(df.english>90)]loc可以使用邏輯運算符設(shè)置具體的篩選條件。df2=df.loc[df['math']>80]#表示選取math列大于80的行print(df2)按篩選條件進(jìn)行匯總很多時候我們還需要對篩選后的結(jié)果進(jìn)行匯總,例如求和,計數(shù),或計算均值等等。也就是Excel中常用的sumifs和countifs函數(shù)。importpandasaspddf=pd.DataFrame([[199901,'張海','男',100,100,95,72],[199902,'趙大強','男',95,54,44,88],[199903,'李梅','女',54,76,13,91],[199904,'吉建軍','男',89,78,26,100]],columns=['xuehao','name','sex','physics','python','math','english'],index=[1,4,6,2])df1=df[(df.english>80)]print(df1['english'].count())print(df1['english'].mean())#計算>80的英語平均分按篩選條件進(jìn)行匯總importpandasaspd

df=pd.DataFrame([[199901,'張海','男',100,100,95,72],

[199902,'趙大強','男',95,54,44,88],

[199903,'李梅','女',54,76,13,91],

[199904,'吉建軍','男',89,78,26,100]],

columns=['xuehao','name','sex','physics','python','math','english'],

index=[1,4,6,2])

s2=df.loc[df['math']<80].math.sum()#表示選取math列小于80的行求math總和

print(s2)

s2=df.loc[df['math']<80].math.mean()#表示選取math列小于80的行求math平均分

print(s2)過濾過濾根據(jù)定義的條件過濾數(shù)據(jù),并返回滿足條件的數(shù)據(jù)集。filter()函數(shù)用于過濾數(shù)據(jù)。filter()函數(shù)格式如下:Series.filter(items=None,like=None,regex=None,axis=None)DataFrame.filter(items=None,like=None,regex=None,axis=None)例如:df1=df.filter(items=['sex','math','english'])#篩選需要的列print(df1)也可以使用regex正則表達(dá)式參數(shù)。例如獲取列名h結(jié)尾的數(shù)據(jù)。df2=df.filter(regex='h$',axis=1)like參數(shù)意味“包含”。例如獲取行索引包含2的數(shù)據(jù)。df3=df.filter(like='2',axis=0)17.5Pandas數(shù)據(jù)導(dǎo)入導(dǎo)出1.導(dǎo)入CSV文件importpandasaspddf=pd.read_csv("marks.csv")還有另外一種方法:df=pd.read_table("marks.csv",sep=",")17.5.2讀取其它格式數(shù)據(jù)1.導(dǎo)入Excel文件pd.read_excel(filename)從Excel文件導(dǎo)入數(shù)據(jù)。例如:xls=pd.read_excel("marks.xlsx")sheet1=xls.parse("Sheet1")sheet1就是一個DataFrame對象。17.5.2讀取其它格式數(shù)據(jù)2.導(dǎo)入JSON格式文件Pandas提供的read_json()函數(shù),可以用來創(chuàng)建Series或者pandasDataFrame數(shù)據(jù)結(jié)構(gòu)。(1)利用JSON字符串imp

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論