人工智能基礎(Python實現)-課件 第4章Pandas數據分析庫_第1頁
人工智能基礎(Python實現)-課件 第4章Pandas數據分析庫_第2頁
人工智能基礎(Python實現)-課件 第4章Pandas數據分析庫_第3頁
人工智能基礎(Python實現)-課件 第4章Pandas數據分析庫_第4頁
人工智能基礎(Python實現)-課件 第4章Pandas數據分析庫_第5頁
已閱讀5頁,還剩95頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第4章

Pandas數據分析庫本章學習目標01了解Pandas數據分析庫以及數據結構的基本概念。03熟悉Pandas中數據框的索引、切片、布爾索引等數據選擇技術,以及如何進行數據的合并、連接和轉換。05學習Pandas中的數據清洗技巧,包括處理缺失值、異常值、重復值,以及數據類型轉換,確保數據質量。02掌握利用Pandas進行數據結構創(chuàng)建與操作。04理解Pandas在處理時間序列數據時的優(yōu)勢,包括時間序列的生成、索引設置、時間間隔計算、重采樣、移動窗口計算和時間序列數據分析。06培養(yǎng)使用Pandas解決實際數據分析問題的能力。目錄4.2數據選擇與過濾4.3數據分組與聚合4.4合并和連接4.1Pandas數據結構的創(chuàng)建與操作4.5數據讀取和存儲4.6數據清洗和預處理4.7時間序列處理pandas導入慣例importpandasaspd01frompandasimportSeries02frompandasimportDataFrame034.1Pandas數據結構的創(chuàng)建與操作

序列創(chuàng)建與基本操作4.1.1數據框創(chuàng)建與基本操作4.1.24.1Pandas數據結構的創(chuàng)建與操作序列概念:序列是用于存儲一維數組的結構。要素:一組數據和對應的索引,索引可以是默認的整數索引或用戶自定義的標簽。4.1.1序列創(chuàng)建與基本操作1.創(chuàng)建方法實例演示(1)用列表作為參數,并且不指定索引,自動生成整數索引In:a=Series([6.3,43.1,24.4])aOut:06.3143.1224.4dtype:float644.1.1序列創(chuàng)建與基本操作1.創(chuàng)建方法實例演示(2)用numpy數組作為參數,并且用index參數指定標簽。In:chengji=Series(np.array((70,85,90)),index=['語文','數學','英語'])chengjiOut:語文70#標簽表示課程,值表示分數數學85英語904.1.1序列創(chuàng)建與基本操作1.創(chuàng)建方法實例演示(3)創(chuàng)建序列對象后通過該對象的index屬性修改標簽。In:gu=Series([6.3,43.1,24.4])gu.index=['幸福銀行','平安科技','南方通信']guOut:幸福銀行6.3#標簽表示股票的名稱,值表示股票的價格平安科技43.1南方通信24.4對比有標簽的對象和沒有標簽的對象,區(qū)別在哪里?4.1.1序列創(chuàng)建與基本操作2.訪問對象的元素實例演示(1)通過索引。無論對象有無標簽,都可以通過索引訪問其中的元素。(2)通過標簽。當對象有標簽時,可以通過標簽訪問對應的元素。通過自定義標簽,用戶可以方便地理解和訪問數據,而不需要依賴整數索引。In:a[1]Out:43.1In:gu[2]Out:24.4In:chengji['數學']Out:85In:gu['南方通信']Out:24.44.1.1序列創(chuàng)建與基本操作3.對序列對象切片實例演示對序列對象切片,切片得到的是原始對象的視圖。有如下方法。(1)索引切片。通過索引切片與對Python可迭代對象切片的方法相同。(2)標簽切片。通過標簽切連續(xù)的元素,語法格式如下:對象['起始標簽':'結束標簽']In:gu[0:2]Out:幸福銀行6.3平安科技43.1In:gu['平安科技':'南方通信']Out:平安科技43.1南方通信24.44.1.1序列創(chuàng)建與基本操作4.增加元素和修改序列元素實例演示創(chuàng)建好序列對象后,還可以增加元素和修改其中的元素,方法與Python字典對象相同,語法格式如下:對象['標簽1']=值當原對象中存在標簽1時,該語句修改它的值。反之,則在其中增加標簽1,以及對應的值。In:gu['南方通信']=25.3gu['光明證券']=17.78guOut:幸福銀行6.30平安科技43.10南方通信25.30#修改了元素值光明證券17.78#增加了一個元素4.1.1序列創(chuàng)建與基本操作5.刪除元素實例演示使用序列對象的drop()方法來刪除一個或多個元素。通過指定元素的標簽,drop()刪除指定元素并返回一個新序列對象,其中不包含被刪除的元素。需要注意的是,drop()默認不會修改原始序列,除非使用inplace=True參數。(1)刪除單個元素時,直接將元素的標簽值傳給drop函數。In:gudel=gu.drop('光明證券')gudel#新對象刪除了光明證券Out:幸福銀行6.3平安科技43.1南方通信25.34.1.1序列創(chuàng)建與基本操作5.刪除元素實例演示(2)刪除多個元素時,將多個標簽值封裝到一個列表傳給drop函數,列表中標簽的順序可以與序列對象中的順序不同。(3)如果要在原始對象序列中刪除指定標簽值,需要指定inplace參數。In:gudel=gu.drop(['光明證券','平安科技'])gudel#新對象刪除了光明證券和平安科技Out:幸福銀行6.3南方通信25.3In:gu.drop('光明證券',inplace=True)gu#在原始對象中刪除了光明證券Out:幸福銀行6.3平安科技43.1南方通信25.34.1.1序列創(chuàng)建與基本操作6.運算操作實例演示序列對象支持多種運算操作,如數值運算、邏輯運算等,且這些運算能夠在整個數據序列上高效執(zhí)行。In:open=Series([23.5,6.1,42.1],index=['南方通信','幸福銀行','平安科技'])open+1.0Out:南方通信24.5幸福銀行7.1平安科技43.1In:open>10.0Out:南方通信True幸福銀行False平安科技True4.1.1序列創(chuàng)建與基本操作6.運算操作實例演示序列之間也可以進行運算,Pandas會根據索引對齊數據進行操作。即使兩個序列的索引不同,也能自動處理數據的對齊問題,自動對齊大大提升了數據操作的靈活性和簡便性,使得數據分析變得更加高效、可靠。In:close=Series([44.3,22.6,6.5],index=['平安科技','南方通信','幸福銀行',])close–openOut:南方通信-0.9平安科技2.2幸福銀行0.4兩個序列對象的索引順序不同,系統自動處理數據對齊。4.1.2數據框創(chuàng)建與基本操作1.創(chuàng)建數據框實例演示數據框是一種二維的數據結構,用于存儲和處理表格數據,它具有行和列的標簽。創(chuàng)建數據框對象時需要分別指定行、列標簽。常用兩種方法創(chuàng)建數據框。(1)從字典創(chuàng)建。字典的鍵成為列標簽,再用index參數指定行標簽。In:data={'平安科技':[45.2,47.1,46.5,49.8],'南方通信':[31.9,27.3,25.2,24.5],'幸福銀行':[3.4,4.6,5.2,6.8]}df=DataFrame(data,index=['2024-01','2024-02','2024-03','2024-04'])dfOut:平安科技南方通信幸福銀行2024-0145.231.93.42024-0247.127.34.62024-0346.525.25.22024-0449.824.56.84.1.2數據框創(chuàng)建與基本操作1.創(chuàng)建數據框實例演示(2)從二維列表創(chuàng)建。二維列表的元素成為數據框的行數據,再用index參數指定行標簽和columns參數指定列標簽。In:data=[[45.2,31.9,3.4],[47.1,27.3,4.6],[46.5,25.2,5.2],[49.8,24.5,6.8]]col=['平安科技','南方通信','幸福銀行']ind=['2024-01','2024-02','2024-03','2024-04']df=DataFrame(data,columns=col,index=ind)dfOut:平安科技南方通信幸福銀行2024-0145.231.93.42024-0247.127.34.62024-0346.525.25.22024-0449.824.56.84.1.2數據框創(chuàng)建與基本操作2.在數據框末尾追加新行實例演示創(chuàng)建數據框對象后,在pandas2.x版本中,使用concat()方法在數據框末尾追加新行。In:new_row=pd.DataFrame({'平安科技':45.6,'南方通信':26.4,'幸福銀行':5.8},index=['2024-05'])#新行也是一個數據框df=pd.concat([df,new_row])Out:平安科技南方通信幸福銀行2024-0145.231.93.42024-0247.127.34.62024-0346.525.25.22024-0449.824.56.82024-0545.626.45.84.1.2數據框創(chuàng)建與基本操作2.在數據框末尾追加新行實例演示在pandas1.x版本中,可以通過append()方法在數據框末尾追加新行。該方法的參數可以是一個字典或者序列對象,結果有兩種情況。(1)參數是序列對象,且包含name屬性。序列對象的數據添加到數據框對象的末尾,它的name屬性作為新行的行標簽。In:s=pd.Series({'平安科技':45.6,'南方通信':26.4,'幸福銀行':5.8},name='2024-05')df.append(s)Out:平安科技南方通信幸福銀行2024-0145.231.93.42024-0247.127.34.62024-0346.525.25.22024-0449.824.56.82024-0545.626.45.8#name作為行標簽4.1.2數據框創(chuàng)建與基本操作2.在數據框末尾追加新行實例演示(2)參數是字典或者無name屬性的序列對象。需要通過設置ignore_index=True來自動生成新的行索引。append方法生成一個新數據框對象,而不修改原始對象。如果要修改原始對象,只需將它的返回值賦值給原對象,如:df=df.append(參數)In:df.append({'平安科技':45.6,'南方通信':26.4,'幸福銀行':5.8},ignore_index=True)Out:平安科技南方通信幸福銀行045.231.93.4#新生成的對象重建了行標簽147.127.34.6246.525.25.2349.824.56.8445.626.45.84.1.2數據框創(chuàng)建與基本操作3.增加新列實例演示可以直接通過賦值的方式增加新列,格式如下:對象['新列名']=數據

#數據可以是列表和序列對象,長度要與原對象相同。In:df['三一重工']=[14.2,15.6,17.8,16.5]Out:平安科技南方通信幸福銀行五一重工2024-0145.231.93.414.22024-0247.127.34.615.62024-0346.525.25.217.82024-0449.824.56.816.54.1.2數據框創(chuàng)建與基本操作4.刪除行和列實例演示數據框對象的drop方法可以用來刪除行和列,該方法的格式如下:對象.drop('標簽名',axis,inplace)刪除行時標簽名為行標簽名,axis為0或者不提供該參數。刪除列時標簽名為列標簽名,axis為1。inplace的值為True直接修改原始對象,否則生成一個新對象。In:df.drop('2024-02')#刪除一行Out:平安科技南方通信幸福銀行五一重工2024-0145.231.93.414.22024-0346.525.25.217.82024-0449.824.56.816.5In:df.drop('幸福銀行',axis=1)#刪除一列Out:平安科技南方通信五一重工2024-0145.231.914.22024-0247.127.315.62024-0346.525.217.82024-0449.824.516.54.1.2數據框創(chuàng)建與基本操作5.對數據進行排序實例演示sort_values()方法用于根據指定列或索引對數據進行排序。它能夠對一列或多列的數據按升序或降序排列,默認情況下為升序。In:data={'姓名':['張軍','王怡','李和'],'年齡':[25,30,25],'體重':[67,82,76]}df=pd.DataFrame(data)df.sort_values(by='體重')#按體重升序排序Out:姓名年齡體重2李和25760張軍25671王怡3082In:df.sort_values(by='體重',ascending=False)#降序排序Out:姓名年齡體重1王怡30820張軍25672李和25764.1.2數據框創(chuàng)建與基本操作5.對數據進行排序實例演示sort_values()方法用于根據指定列或索引對數據進行排序。它能夠對一列或多列的數據按升序或降序排列,默認情況下為升序。In:df.sort_values(by=['年齡','體重'])#兩個排序關鍵字,先按年齡排序,如果年齡相同則按體重排Out:姓名年齡體重2李和25760張軍25671王怡30824.2數據選擇與過濾4.2.3多條件聯合篩選4.2.2基于條件的數據篩選4.2.1使用選擇器和快速訪問器4.2.1使用選擇器和快速訪問器1.按列訪問實例演示按列訪問數據框時,有以下兩種語法形式:對象名['列標簽']#列標簽要加引號對象名.列標簽#列標簽不加引號對象名['列標簽']:列標簽作為字符串處理,引號是必要的,可以處理任意字符的列標簽。對象名.列標簽:這是通過數據框的屬性訪問列。引號不需要,這種方式對列標簽的要求較嚴格,不能有空格、特殊字符,且不能與已有的方法或屬性重名。In:df['平安科技']Out:2024-0145.22024-0247.12024-0346.52024-0449.8Name:平安科技,dtype:float64In:df.南方通信Out:2024-0131.92024-0227.32024-0325.22024-0424.5Name:南方通信,dtype:float644.2.1使用選擇器和快速訪問器1.按列訪問實例演示訪問一列后,如果還要繼續(xù)訪問其中的一個元素,則按照訪問序列對象的方法,如:對象名['列標簽']['行標簽']

#注意:列標簽在前,行標簽在后In:df["平安科技"]['2024-02']Out:47.14.2.1使用選擇器和快速訪問器1.按列訪問實例演示數據框按列訪問不支持切片,但是支持索引標簽切片,語法格式為:對象名[['列標簽',…]]:In:df[['平安科技','幸福銀行']]Out:平安科技幸福銀行2024-0145.23.42024-0247.14.62024-0346.55.22024-0449.86.84.2.1使用選擇器和快速訪問器2.按行訪問實例演示按行訪問需要用選擇器loc和iloc,有多種形式,如表4-1所示。loc通過標簽來進行數據訪問iloc通過整數索引來進行數據訪問In:df.loc['2024-01']Out:平安科技45.2南方通信31.9幸福銀行3.4Name:2024-01,dtype:float64In:df.iloc[1]Out:平安科技47.1南方通信27.3幸福銀行4.6Name:2024-02,dtype:float644.2.1使用選擇器和快速訪問器2.按行訪問實例演示訪問一行后,如果還要繼續(xù)訪問其中的一個元素,則按照訪問序列對象的方法,如:對象名.loc['行標簽']['列標簽']#注意:行標簽在前,列標簽在后對象名.iloc[行索引][列索引]#行索引在前,列索引在后In:df.loc['2024-01']['平安科技']Out:45.24.2.1使用選擇器和快速訪問器3.切片實例演示使用選擇器loc按行對數據框切片按行索引切片In:df.loc['2024-01':'2024-02']Out:平安科技南方通信幸福銀行2024-0145.231.93.42024-0247.127.34.6#切片結果包含結束標簽In:df.iloc[0:2]Out:平安科技南方通信幸福銀行2024-0145.231.93.42024-0247.127.34.64.2.1使用選擇器和快速訪問器3.切片實例演示同時按行索引、列索引切片有幾種變化的情況。(1)行、列同時切片。In:df.iloc[0:2,0:2]Out:平安科技南方通信2024-0145.231.92024-0247.127.3切前2行和前2列交叉處的數據塊。4.2.1使用選擇器和快速訪問器3.切片實例演示同時按行索引、列索引切片有幾種變化的情況。(1)行、列同時切片。(2)僅按列切片。只切前面兩列的數據。In:df.iloc[:,0:2]Out:平安科技南方通信2024-0145.231.92024-0247.127.32024-0346.525.22024-0449.824.54.2.1使用選擇器和快速訪問器3.切片實例演示同時按行索引、列索引切片有幾種變化的情況。(1)行、列同時切片。(2)僅按列切片。(3)訪問單個元素。訪問行、列索引分別為1、2的元素。In:df.iloc[1,2]Out:4.64.2.1使用選擇器和快速訪問器3.切片實例演示同時按行索引、列索引切片有幾種變化的情況。(1)行、列同時切片。(2)僅按列切片。(3)訪問單個元素??焖僭L問器at[]和iat[]用于快速取出單個元素,功能與loc和iloc類似,但是,只訪問單個元素,性能得到優(yōu)化,速度更快。at[]通過行和列的標簽來獲取元素。In:df.at['2024-02','平安科技']#行標簽在前,列標簽在后Out:47.1iat[]通過整數位置來訪問單個元素。In:df.iat[0,2]#行索引在前,列索引在后Out:3.44.2.2基于條件的數據篩選1.布爾索引實例演示序列和數據框都支持布爾索引,使用一個布爾值列表或序列對象來選擇對應位置為True的元素,在數據框中是選擇對應的行,語法格式為:對象[[True,False,…]]#對象是序列對象,或者數據框對象,外層括號中可以是一個列表,也可以是一個序列對象,只要其中是布爾值。In:close[[True,False,False]]Out:平安科技44.3In:df[[True,False,True,False]]Out:平安科技南方通信幸福銀行2024-0145.231.93.42024-0346.525.25.24.2.2基于條件的數據篩選2.關系運算實例演示序列對象可以進行關系運算,其結果是序列對象,元素值為布爾值。In:close>20Out:平安科技True南方通信True幸福銀行Falsedtype:bool4.2.2基于條件的數據篩選2.關系運算實例演示數據框選擇一列后也可以進行關系運算,其結果是序列對象,元素值為布爾值。In:df['平安科技']>47Out:2024-01False2024-02True2024-03False2024-04TrueName:平安科技,dtype:bool4.2.2基于條件的數據篩選3.基于條件的數據篩選實例演示把關系運算看作一個條件,可以直接把序列和數據框關系運算和布爾索引結合起來,形成基于條件的數據篩選。In:close[close>20]Out:平安科技44.3南方通信22.6In:df[df['平安科技']>47]Out:平安科技南方通信幸福銀行2024-0247.127.34.62024-0449.824.56.84.2.3多條件聯合篩選多條件的數據篩選實例演示當篩選條件多于一個時,可以通過邏輯運算符&(與)、|(或)進行組合,形成多條件聯合篩選。In:close[(close>20)&(close<40)]#每個條件都要用圓括號Out:南方通信22.6In:df[(df['平安科技']>47)&(df['南方通信']>26)]Out:平安科技南方通信幸福銀行2024-0247.127.34.64.3數據分組與聚合4.3.3分組后的數據轉換4.3.2對分組數據進行聚合操作4.3.1數據分組4.3數據分組與聚合根據一個或多個列的值,將數據分為若干組。然后對每組數據進行聚合操作,如匯總、統計、計算等操作。groupby()方法分組的列標簽功能實現參數示例數據姓名分區(qū)一季度二季度三季度四季度0趙四天河25723291438826721錢多黃埔28453161372336632孫冰越秀21003371390130243李萌黃埔44833810107023124周金天河41092322305640665吳達天河24354863157619346鄭華黃埔46631831145134567王軍越秀4839121436392649生成示例數據代碼In:df=DataFrame({'姓名':['趙四','錢多','孫冰','李萌','周金','吳達','鄭華','王軍'],'分區(qū)':['天河','黃埔','越秀','黃埔','天河','天河','黃埔','越秀'],'一季度':[2572,2845,2100,4483,4109,2435,4663,4839],'二季度':[3291,3161,3371,3810,2322,4863,1831,1214],'三季度':[4388,3723,3901,1070,3056,1576,1451,3639],'四季度':[2672,3663,3024,2312,4066,1934,3456,2649]})4.3.1數據分組1.分組實例演示數據分組由數據框對象的groupby()方法完成,參數為分組的列標簽,生成一個分組對象,如按照“分區(qū)”分組的方法:In:group=df.groupby('分區(qū)')4.3.1數據分組2.查看分組實例演示生成一個分組對象,通過該對象可以查看分組情況。In:group.ngroups#ngroups為分組對象的屬性Out:3#數據框被分成了3組從結果可以看出,所有數據按照分區(qū)被分成了3組。4.3.1數據分組2.查看分組實例演示生成一個分組對象,通過該對象可以查看分組情況。In:group.size()#查看各分組的數量Out:分區(qū)天河3越秀2黃埔34.3.1數據分組2.查看分組實例演示生成一個分組對象,通過該對象可以查看分組情況。In:forname,gingroup:#遍歷各分組 print("分組名:",name) print(g)分組名:天河姓名分區(qū)一季度二季度三季度四季度0趙四天河25723291438826724周金天河41092322305640665吳達天河2435486315761934分組名:越秀姓名分區(qū)一季度二季度三季度四季度2孫冰越秀21003371390130247王軍越秀4839121436392649分組名:黃埔姓名分區(qū)一季度二季度三季度四季度1錢多黃埔28453161372336633李萌黃埔44833810107023126鄭華黃埔46631831145134564.3.2對分組數據進行聚合操作聚合操作可以將每個組的數據進行匯總、計算等,從而提取有用的信息。實現:agg方法聚合操作以及對應的函數名稱為:求和(sum)、計數(count)、平均值(mean)、最大值(max)、最小值(min)等。4.3.2對分組數據進行聚合操作實例演示(1)對一個列標簽執(zhí)行一種聚合In:group.agg({'一季度':'sum'})#參數是一個字典,列標簽是鍵,操作名是值Out:一季度分區(qū)天河9116#結果代表天河區(qū)所有人的總和越秀6939黃埔1199114.3.2對分組數據進行聚合操作實例演示(2)對一個列標簽執(zhí)行多種聚合In:group.agg({'一季度':['sum','max']})#參數是操作名列表Out:一季度 summax分區(qū)天河91164109越秀69394839黃埔11991466324.3.2對分組數據進行聚合操作實例演示(3)對多個列標簽執(zhí)行多種聚合In:group.agg({'一季度':['sum','max'],'二季度':['mean','min']})#每個列標簽和操作構成一個鍵值對Out:一季度二季度 summaxmeanmin分區(qū)天河911641093492.02322越秀693948392292.51214黃埔1199146632934.0183134.3.3分組后的數據轉換實例演示用groupby()對數據進行分組后,還可以通過數據轉換來修改或生成新的數據。實現transform()函數參數操作名字符串功能將操作應用到每一個分組,轉換后返回返回一個序列In:group['四季度'].transform('mean')#計算各區(qū)四季度的平均值。Out:02890.666667#表示天河區(qū)四季度的平均值13143.66666722836.50000033143.66666742890.66666752890.66666763143.66666772836.500000Name:四季度,dtype:float64transform()函數“每個分組數據在轉換后會被應用回原始DataFrame的相應位置”意思是標簽0、4、5對應的值為四季度天河區(qū)的平均值4.4合并和連接4.4.3數據框連接4.4.2合并方式4.4.1數據框合并4.4.1數據框合并實例演示merge()用來合并兩個數據框。參數on指定合并關鍵字。In:yu=pd.DataFrame({'學號':['201','202','203'],'語文':[91,82,93]})shu=pd.DataFrame({'學號':['203','202','201'],'數學':[94,85,96]})cheng=pd.merge(yu,shu,on='學號')chengOut:學號語文數學020191961202828522039394merge()方法

merge()函數將兩個數據框yu和shu按照學號列進行合并,生成一個新的數據框。數據框yu和shu中,學號列的順序可以不同,pandas能夠自動對齊。4.4.2合并方式實例演示merge()方法用來將兩個數據框合并成一個。使用merge()合并時,它的一個重要參數是how,它決定了數據框合并的類型。1.內連接內連接只保留兩個數據框中共同鍵值的行。也就是說,只有當兩個數據框的鍵值匹配時,才會在結果中顯示這行數據。how的值為inner,這也是默認值。In:yu=pd.DataFrame({'學號':['201','202','203'],'語文':[91,82,93]})shu=pd.DataFrame({'學號':['204','202','201'],'數學':[94,85,96]})cheng=pd.merge(yu,shu,on='學號',how='inner')chengOut:學號語文數學02019196120282851.內連接

只有兩個數據框中都出現的學號201和202才出現在合并后的數據框中。4.4.2合并方式實例演示2.左連接左連接保留左側數據框中的所有行,右側數據框只有與左側匹配的行會出現在結果中。如果沒有匹配,則右側的數據用NaN填充。how的值為left。In:cheng=pd.merge(yu,shu,on='學號',how='left')chengOut:學號語文數學02019196.012028285.0220393NaN2.左連接

保留數據框yu中的所有行,203號沒有數學成績,用NaN填充。4.4.2合并方式實例演示3.右連接右連接與左連接相反,它保留右側數據框的所有行,左側數據框只有匹配的行會出現在結果中。如果沒有匹配,則左側的數據用NaN填充。how的值為right。In:cheng=pd.merge(yu,shu,on='學號',how='right')chengOut:學號語文數學0204NaN94120282.085220191.0963.右連接

保留數據框shu中的所有行,204號沒有語文成績,用NaN填充。4.4.2合并方式實例演示4.外連接外連接保留兩個數據框中的所有行,缺少匹配的數據會用NaN填充。這種方式合并所有鍵的值,不管是否匹配。how的值為outer。In:cheng=pd.merge(yu,shu,on='學號',how='outer')chengOut:學號語文數學020191.096.0120282.085.0220393.0NaN3204NaN94.04.外連接

203號沒有數學成績,204號沒有語文成績,均以NaN填充。4.4.3數據框連接實例演示concat()方法用于連接多個數據框。例如,數據框df1表示一個班的部分同學的語文和數學成績,df2表示另一部分同學的成績,現在需要將它們連接成一個數據框。參數ignore_index=True用于重建索引。In:df1=pd.DataFrame({'學號':['201','202','203'],'語文':[91,82,93],'數學':[94,85,96]})df2=pd.DataFrame({'學號':['204','205','206'],'語文':[95,87,83],'數學':[84,75,91]})cheng=pd.concat([df1,df2],ignore_index=True)chengOut:學號語文數學020191941202828522039396320495844205877552068391concat()方法

4.5數據讀取和存儲4.5.2讀寫Excel文件4.5.1讀寫CSV文件4.5.1讀寫CSV文件實例演示CSV(Comma-SeparatedValues,逗號分隔值)是一種常見的用于存儲表格數據的純文本格式。使用to_csv()和read_csv()函數可以實現CSV文件的存取。to_csv()是數據框的成員,要通過數據框對象調用。In:data=[[800,750,500],[700,800,600],[680,720,580]]col=['會計','保險','外語']ind=['2022','2023','2024']df=DataFrame(data,columns=col,index=ind)df.to_csv('renshu.csv',index=True)1.to_csv()方法

4.5.1讀寫CSV文件實例演示CSV(Comma-SeparatedValues,逗號分隔值)是一種常見的用于存儲表格數據的純文本格式。使用to_csv()和read_csv()函數可以實現CSV文件的存取。to_csv()是數據框的成員,要通過數據框對象調用。1.to_csv()方法

index=True指示保存索引,renshu.csv文件內容顯示如下,會計,保險,外語2022,800,750,5002023,700,800,6002024,680,720,580index=False指示不保存索引,則renshu.csv文件內容更改為如下會計,保險,外語800,750,500700,800,600680,720,58004.5.1讀寫CSV文件實例演示CSV文件默認時用逗號分隔數據,也可以用sep參數指定其他的分隔符。1.to_csv()方法

In:df.to_csv('renshu.csv',index=True,sep='\t')sep='\t'指示用制表符作為數據分隔符,renshu.csv文件內容如下 會計 保險 外語2022 800 750 5002023 700 800 6002024 680 720 5804.5.1讀寫CSV文件實例演示read_csv()是pandas的成員,要通過pandas調用。read_csv()函數可以將CSV文件讀取為DataFrame對象。Pandas默認使用UTF-8編碼。如果文件是用pandas的to_csv寫的,則用read_csv讀取的時候不用指定編碼。如果文件是別的方式創(chuàng)建的,則用read_csv讀取的時候需要指定創(chuàng)建時的編碼,否則會出現中文亂碼。2.read_csv方法

In:df=pd.read_csv('renshu.csv',index_col=0,sep='\t')根據文件內容設置參數index_col和sep,如果文件第一列是索引,則設置參數index_col,否則不設置。根據文件的分隔符設置參數sep。4.5.2讀寫Excel文件實例演示to_excel()和read_excel()函數實現Excel文件的存取。to_excel()是數據框的成員,要通過數據框對象調用。1.to_excel()方法

In:df.to_excel('renshu.xlsx',index=True)參數index=True指定需要保存索引。如果不需要保存索引,則設置index=False。保存結果如圖4-1所示。4.5.2讀寫Excel文件實例演示函數to_excel保存的默認工作表的名稱是Sheet1,可以通過設置參數sheet_name來指定工作表的名稱。1.to_excel()方法

In:df.to_excel('renshu.xlsx',sheet_name='學院',index=True)4.5.2讀寫Excel文件實例演示通過函數to_excel()保存的excel工作簿中只有一個工作表。如果要在一個工作簿中保存多個工作表,則要利用pandas的ExcelWriter對象。1.to_excel()方法

frompandasimportExcelWriterwithExcelWriter('workbook.xlsx')aswriter:df1.to_excel(writer,sheet_name='表1')df1.to_excel(writer,sheet_name='表2')如要將兩個數據框對象df1和df2寫入一個工作簿workbook.xlsx,工作表名分別時表1和表2,則示例代碼如下4.5.2讀寫Excel文件實例演示read_excel()是pandas的成員,要通過pandas調用。read_excel()用于讀取Excel文件。參數sheet_name用于指定工作表名稱,如果讀取工作簿的第一個工作表,也可以不設置該參數。如果工作表包含索引,則設置參數index_col,否則不設置該參數。2.read_excel方法

In:df=pd.read_excel('renshu.xlsx',sheet_name='學院',index_col=0)4.6數據清洗和預處理4.6.1缺失值檢測與處理4.6.2異常值檢測與處理4.6.3重復值檢測與處理4.6.4數據類型轉換4.6.1缺失值檢測與處理實例演示isna()或isnull()方法用來檢測缺失值,返回一個布爾型的DataFrame,標識數據中哪些位置有缺失值。1.檢測缺失值

In:a=np.array([[163,113,158],[np.nan,np.nan,119],[193,127,np.nan],[109,126,110]])df=DataFrame(a,index=['一月','二月','三月','四月'],columns=['美好集團','北方通信','廣東科技'])df.isna()#df.isnull()兩個函數的輸出結果相同Out:美好集團北方通信廣東科技一月FalseFalseFalse二月TrueTrueFalse三月FalseFalseTrue四月FalseFalseFalseTrue對應的位置有缺失值4.6.1缺失值檢測與處理實例演示處理缺失值的方式取決于數據分析的需求。常用的方法包括使用dropna()刪除包含缺失值的行或列2.處理缺失值

In:df.dropna()#刪除有缺失值的行,并返回一個新數據框Out:美好集團北方通信廣東科技一月163.0113.0158.0四月109.0126.0110.04.6.1缺失值檢測與處理實例演示處理缺失值的方式取決于數據分析的需求。常用的方法包括fillna()用特定值(如均值、中位數或前后值)填充缺失值2.處理缺失值

In:df.fillna(0)Out:美好集團北方通信廣東科技一月163.0113.0158.0二月0.00.0119.0三月193.0127.00.0四月109.0126.0110.0用0值填充缺失值。4.6.1缺失值檢測與處理實例演示處理缺失值的方式取決于數據分析的需求。常用的方法包括fillna()用特定值(如均值、中位數或前后值)填充缺失值2.處理缺失值

In:df.fillna(method='ffill')Out:美好集團北方通信廣東科技一月163.0113.0158.0二月163.0113.0119.0三月193.0127.0119.0四月109.0126.0110.0用缺失值前面的值填充。參數method='bfill'指定用后面的值填充缺失值。4.6.1缺失值檢測與處理實例演示處理缺失值的方式取決于數據分析的需求。常用的方法包括fillna()用特定值(如均值、中位數或前后值)填充缺失值2.處理缺失值

In:df.fillna(value=df.mean())Out:美好集團北方通信廣東科技一月163.0113.0158.0二月155.0122.0119.0三月193.0127.0129.0四月109.0126.0110.0用所在列的平均值填充缺失值。4.6.2異常值檢測與處理2.quantile()函數異常值是指數據中偏離正常范圍的極端值,可能是由于測量錯誤、數據錄入錯誤或其他原因導致的。這些異常值如果不加以處理,可能會影響計算的準確性和分析結果。1.異常值及其計算

第一分位數Q1第三分位數Q3IQR=Q3-Q1異常值小于Q1-1.5*IQR或大于Q3+1.5*IQRquantile()函數用于計算數據的分位數。分位數是將數據按指定百分比劃分的值,用于分析數據的分布情況。通過quantile()函數,可以計算出25%、75%等常用的分位數。25%和75%分位數分別稱為第一和第三四分位數。第一分位數Q1第三分位數Q3實例演示data=pd.Series([10,12,15,20,100,25,30,200])#1.計算四分位數范圍(IQR)Q1=data.quantile(0.25)Q3=data.quantile(0.75)IQR=Q3-Q1#2.識別異常值lower_bound=Q1-1.5*IQRupper_bound=Q3+1.5*IQRoutliers=(data<lower_bound)|(data>upper_bound)#3.計算均值(不包含異常值)mean_value=data[~outliers].mean()#4.用均值替換異常值data[outliers]=mean_valueprint("處理后的數據:")print(data)【例4-1】編寫程序識別序列對象的異常值,并用均值替代異常值。4.6.3重復值檢測與處理重復值檢測與處理是數據清洗的一個重要步驟。通過檢測并處理數據中的重復值,可以保證數據的完整性和準確性,避免冗余數據影響分析結果。duplicated()函數用于檢測數據中的重復值。該函數會返回一個布爾類型的序列對象,指示每一行是否為重復行。通常情況下,保留第一次出現的值,后續(xù)重復的值會標記為True。1.檢測重復值

實例演示In:data={'A':[1,2,2,3],'B':[4,5,5,6]}df=DataFrame(data)df.duplicated()Out:0False1False2True#這一行被標記為重復行3False4.6.3重復值檢測與處理drop_duplicates()函數用于刪除重復值??蛇x擇保留第一行或最后一行。2.刪除重復值

實例演示In:df.drop_duplicates(keep='first')Out:AB014125#保留第一行,重復行數據相同,序號不同336In:df.drop_duplicates(keep='last')Out:AB014225#保留最后一行3364.6.4數據類型轉換因為不同的分析方法需要特定的數據類型,數據類型轉換是處理和清洗數據的常見操作。通常采用astype()方法,可以將序列、數據框指定列轉或者數據框對象換為指定的數據類型。astype()方法轉換數據類型

實例演示In:a=np.array([[163,113,132],[175,129,119],[193,127,125],[189,126,110]])df=DataFrame(a,index=['一月','二月','三月','四月'],columns=['美好集團','北方通信','廣東科技'])將數據框的所有列都轉換成目標數據類型。In:df.astype('float32')Out:美好集團北方通信廣東科技一月163.0113.0132.0二月175.0129.0119.0三月193.0127.0125.0四月189.0126.0110.04.6.4數據類型轉換因為不同的分析方法需要特定的數據類型,數據類型轉換是處理和清洗數據的常見操作。通常采用astype()方法,可以將序列、數據框指定列轉或者數據框對象換為指定的數據類型。astype()方法轉換數據類型

實例演示只轉換數據框的一列,生成一個新的序列對象。In:df['北方通信'].astype('float32')Out:一月113.0二月129.0三月127.0四月126.0Name:北方通信,dtype:float32以下命令可以將新生成的對象寫入原始對象。In:df['北方通信']=df['北方通信'].astype('float32')4.7時間序列處理時間序列數據是指按時間順序排列的數據,通常用于表示金融市場數據、傳感器數據、氣象數據等。數據框常以時間作為行標簽保存時間序列數據。4.7時間序列處理時間序列生成與索引設置4.7.1時間序列數據分析4.7.5時間間隔計算與轉換4.7.2移動窗口計算4.7.4時間序列數據重采樣4.7.34.7.1時間序列生成與索引設置date_range()函數可以快速生成規(guī)則的時間序列。例如,可以生成按天、按月、按年等遞增的時間序列。參數start指定起始日期,periods指定周期數,freq指定頻率,D、M、Y分別表示天、月、年。1.date_range()函數

實例演示In:dates=pd.date_range(start='2024-01-01',periods=10,freq='D')datesOut:DatetimeIndex(['2024-01-01','2024-01-02','2024-01-03','2024-01-04','2024-01-05','2024-01-06','2024-01-07','2024-01-08','2024-01-09','2024-01-10'],dtype='datetime64[ns]',freq='D')以下代碼可以生成10天的日期序列。4.7.1時間序列生成與索引設置date_range()函數可以快速生成規(guī)則的時間序列。例如,可以生成按天、按月、按年等遞增的時間序列。參數start指定起始日期,periods指定周期數,freq指定頻率,D、M、Y分別表示天、月、年。1.date_range()函數

實例演示In:dates=pd.date_range(start='2024-01-01',periods=10,freq='M')datesOut:DatetimeIndex(['2024-01-31','2024-02-29','2024-03-31','2024-04-30','2024-05-31','2024-06-30','2024-07-31','2024-08-31','2024-09-30','2024-10-31'],dtype='datetime64[ns]',freq='M')以下代碼可以生成10月的日期序列,每個日期對齊到月末日期。4.7.1時間序列生成與索引設置date_range()函數生成的對象是一個可迭代對象,可以通過索引訪問其中的每一個元素,元素是一個Timestamp對象。2.訪問Timestamp對象

實例演示In:dates[0]Out:Timestamp('2024-01-3100:00:00',freq='M')4.7.1時間序列生成與索引設置在時間序列處理中,通常將日期或時間列設置為索引,以便更好地操作、查詢、切片時間序列數據。如果數據中有日期時間列,但是以字符串的形式存儲,首先可以使用pd.to_datetime()函數將其轉換為datetime格式,然后通過set_index()設置該列為索引。3.將日期或時間列設置為索引

實例演示In:date=['2024-8-1','2024-8-2','2024-8-3','2024-8-4','2024-8-5','2024-8-6','2024-8-7','2024-8-8','2024-8-9','2024-8-10']num=np.random.randint(50,100,size=(10))df=DataFrame({'日期':date,'數量':num})dfOut:日期數量02024-8-181#數據框中有字符串形式的日期數據12024-8-27322024-8-36232024-8-45042024-8-58052024-8-69962024-8-78972024-8-85482024-8-96392024-8-10784.7.1時間序列生成與索引設置在時間序列處理中,通常將日期或時間列設置為索引,以便更好地操作、查詢、切片時間序列數據。如果數據中有日期時間列,但是以字符串的形式存儲,首先可以使用pd.to_datetime()函數將其轉換為datetime格式,然后通過set_index()設置該列為索引。3.將日期或時間列設置為索引

實例演示In:df['日期']=pd.to_datetime(df['日期'])#將'date'列轉換為時間類型df.set_index('日期',inplace=True)dfOut:日期數量

2024-08-0165#日期數據被設置成索引列2024-08-02852024-08-03972024-08-04932024-08-05842024-08-06512024-08-07722024-08-08922024-08-09802024-08-10554.7.1時間序列生成與索引設置可以在創(chuàng)建DataFrame時直接將pd.date_range()生成的日期序列作為索引。3.將日期或時間列設置為索引

實例演示In:dates=pd.date_range(start='2024-08-01',periods=10,freq='D')num=np.random.randint(50,100,size=(10))df=pd.DataFrame(num,index=dates,columns=['數量'])dfOut:數量2024-08-01762024-08-02852024-08-03952024-08-04962024-08-05912024-08-06832024-08-07902024-08-08772024-08-09862024-08-10604.7.2時間間隔計算與轉換時間間隔計算通常涉及兩個時間點或兩個時間序列之間的差異。pandas使用Timedelta對象來表示時間間隔。如果有兩個時間點,可以直接使用減法運算來計算它們之間的時間差,結果是一個Timedelta對象。1.時間間隔計算

實例演示In:start=pd.Timestamp('2024-08-0108:00')end=pd.Timestamp('2024-08-3108:00')diff=end–starttype(diff)Out:pandas._libs.tslibs.timedeltas.TimedeltaIn:diffOut:Timedelta('30days00:00:00')#兩個日期之間相隔30天4.7.2時間間隔計算與轉換對于整個時間序列,也可以通過類似的減法運算計算出每個時間點之間的差異。1.時間間隔計算

實例演示In:times=pd.Series(pd.date_range('2024-01-01',periods=5,freq='M'))diffs=times.diff()#diffs是一個序列,每個點與前一個的差diffsOut:0NaT129days231days330days431days4.7.2時間間隔計算與轉換時間間隔可以轉換為不同的時間單位,如天、小時、分鐘或秒等。Timedelta對象支持直接訪問特定單位的時間差。2.時間間隔轉換

實例演示In:start=pd.Timestamp('2024-09-0108:00:00')end=pd.Timestamp('2024-09-0309:10:10')diff=end-startdiff.days#獲取時間差包含的天數Out:2In:diff.seconds#時間差中除了天數剩余時間包含的秒數,通過計算可以得到小時數和分鐘數Out:4210In:diff.total_seconds()#函數調用,返回時間差包含的總秒數Out[86]:177010.04.7.3時間序列數據重采樣resample用于對時間序列數據進行重采樣。通過resample,可以根據指定的時間頻率對數據進行聚合、填充、插值等操作。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論