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

下載本文檔

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

文檔簡介

第4章

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

序列創(chuàng)建與基本操作4.1.1數(shù)據(jù)框創(chuàng)建與基本操作4.1.24.1Pandas數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建與操作序列概念:序列是用于存儲一維數(shù)組的結(jié)構(gòu)。要素:一組數(shù)據(jù)和對應的索引,索引可以是默認的整數(shù)索引或用戶自定義的標簽。4.1.1序列創(chuàng)建與基本操作1.創(chuàng)建方法實例演示(1)用列表作為參數(shù),并且不指定索引,自動生成整數(shù)索引In:a=Series([6.3,43.1,24.4])aOut:06.3143.1224.4dtype:float644.1.1序列創(chuàng)建與基本操作1.創(chuàng)建方法實例演示(2)用numpy數(shù)組作為參數(shù),并且用index參數(shù)指定標簽。In:chengji=Series(np.array((70,85,90)),index=['語文','數(shù)學','英語'])chengjiOut:語文70#標簽表示課程,值表示分數(shù)數(shù)學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)通過標簽。當對象有標簽時,可以通過標簽訪問對應的元素。通過自定義標簽,用戶可以方便地理解和訪問數(shù)據(jù),而不需要依賴整數(shù)索引。In:a[1]Out:43.1In:gu[2]Out:24.4In:chengji['數(shù)學']Out:85In:gu['南方通信']Out:24.44.1.1序列創(chuàng)建與基本操作3.對序列對象切片實例演示對序列對象切片,切片得到的是原始對象的視圖。有如下方法。(1)索引切片。通過索引切片與對Python可迭代對象切片的方法相同。(2)標簽切片。通過標簽切連續(xù)的元素,語法格式如下:對象['起始標簽':'結(jié)束標簽']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參數(shù)。(1)刪除單個元素時,直接將元素的標簽值傳給drop函數(shù)。In:gudel=gu.drop('光明證券')gudel#新對象刪除了光明證券Out:幸福銀行6.3平安科技43.1南方通信25.34.1.1序列創(chuàng)建與基本操作5.刪除元素實例演示(2)刪除多個元素時,將多個標簽值封裝到一個列表傳給drop函數(shù),列表中標簽的順序可以與序列對象中的順序不同。(3)如果要在原始對象序列中刪除指定標簽值,需要指定inplace參數(shù)。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.運算操作實例演示序列對象支持多種運算操作,如數(shù)值運算、邏輯運算等,且這些運算能夠在整個數(shù)據(jù)序列上高效執(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會根據(jù)索引對齊數(shù)據(jù)進行操作。即使兩個序列的索引不同,也能自動處理數(shù)據(jù)的對齊問題,自動對齊大大提升了數(shù)據(jù)操作的靈活性和簡便性,使得數(shù)據(jù)分析變得更加高效、可靠。In:close=Series([44.3,22.6,6.5],index=['平安科技','南方通信','幸福銀行',])close–openOut:南方通信-0.9平安科技2.2幸福銀行0.4兩個序列對象的索引順序不同,系統(tǒng)自動處理數(shù)據(jù)對齊。4.1.2數(shù)據(jù)框創(chuàng)建與基本操作1.創(chuàng)建數(shù)據(jù)框?qū)嵗菔緮?shù)據(jù)框是一種二維的數(shù)據(jù)結(jié)構(gòu),用于存儲和處理表格數(shù)據(jù),它具有行和列的標簽。創(chuàng)建數(shù)據(jù)框?qū)ο髸r需要分別指定行、列標簽。常用兩種方法創(chuàng)建數(shù)據(jù)框。(1)從字典創(chuàng)建。字典的鍵成為列標簽,再用index參數(shù)指定行標簽。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數(shù)據(jù)框創(chuàng)建與基本操作1.創(chuàng)建數(shù)據(jù)框?qū)嵗菔荆?)從二維列表創(chuàng)建。二維列表的元素成為數(shù)據(jù)框的行數(shù)據(jù),再用index參數(shù)指定行標簽和columns參數(shù)指定列標簽。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數(shù)據(jù)框創(chuàng)建與基本操作2.在數(shù)據(jù)框末尾追加新行實例演示創(chuàng)建數(shù)據(jù)框?qū)ο蠛?,在pandas2.x版本中,使用concat()方法在數(shù)據(jù)框末尾追加新行。In:new_row=pd.DataFrame({'平安科技':45.6,'南方通信':26.4,'幸福銀行':5.8},index=['2024-05'])#新行也是一個數(shù)據(jù)框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數(shù)據(jù)框創(chuàng)建與基本操作2.在數(shù)據(jù)框末尾追加新行實例演示在pandas1.x版本中,可以通過append()方法在數(shù)據(jù)框末尾追加新行。該方法的參數(shù)可以是一個字典或者序列對象,結(jié)果有兩種情況。(1)參數(shù)是序列對象,且包含name屬性。序列對象的數(shù)據(jù)添加到數(shù)據(jù)框?qū)ο蟮哪┪?,它的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數(shù)據(jù)框創(chuàng)建與基本操作2.在數(shù)據(jù)框末尾追加新行實例演示(2)參數(shù)是字典或者無name屬性的序列對象。需要通過設置ignore_index=True來自動生成新的行索引。append方法生成一個新數(shù)據(jù)框?qū)ο?,而不修改原始對象。如果要修改原始對象,只需將它的返回值賦值給原對象,如:df=df.append(參數(shù))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數(shù)據(jù)框創(chuàng)建與基本操作3.增加新列實例演示可以直接通過賦值的方式增加新列,格式如下:對象['新列名']=數(shù)據(jù)

#數(shù)據(jù)可以是列表和序列對象,長度要與原對象相同。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數(shù)據(jù)框創(chuàng)建與基本操作4.刪除行和列實例演示數(shù)據(jù)框?qū)ο蟮膁rop方法可以用來刪除行和列,該方法的格式如下:對象.drop('標簽名',axis,inplace)刪除行時標簽名為行標簽名,axis為0或者不提供該參數(shù)。刪除列時標簽名為列標簽名,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數(shù)據(jù)框創(chuàng)建與基本操作5.對數(shù)據(jù)進行排序?qū)嵗菔緎ort_values()方法用于根據(jù)指定列或索引對數(shù)據(jù)進行排序。它能夠?qū)σ涣谢蚨嗔械臄?shù)據(jù)按升序或降序排列,默認情況下為升序。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數(shù)據(jù)框創(chuàng)建與基本操作5.對數(shù)據(jù)進行排序?qū)嵗菔緎ort_values()方法用于根據(jù)指定列或索引對數(shù)據(jù)進行排序。它能夠?qū)σ涣谢蚨嗔械臄?shù)據(jù)按升序或降序排列,默認情況下為升序。In:df.sort_values(by=['年齡','體重'])#兩個排序關鍵字,先按年齡排序,如果年齡相同則按體重排Out:姓名年齡體重2李和25760張軍25671王怡30824.2數(shù)據(jù)選擇與過濾4.2.3多條件聯(lián)合篩選4.2.2基于條件的數(shù)據(jù)篩選4.2.1使用選擇器和快速訪問器4.2.1使用選擇器和快速訪問器1.按列訪問實例演示按列訪問數(shù)據(jù)框時,有以下兩種語法形式:對象名['列標簽']#列標簽要加引號對象名.列標簽#列標簽不加引號對象名['列標簽']:列標簽作為字符串處理,引號是必要的,可以處理任意字符的列標簽。對象名.列標簽:這是通過數(shù)據(jù)框的屬性訪問列。引號不需要,這種方式對列標簽的要求較嚴格,不能有空格、特殊字符,且不能與已有的方法或?qū)傩灾孛n: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.按列訪問實例演示數(shù)據(jù)框按列訪問不支持切片,但是支持索引標簽切片,語法格式為:對象名[['列標簽',…]]:In:df[['平安科技','幸福銀行']]Out:平安科技幸福銀行2024-0145.23.42024-0247.14.62024-0346.55.22024-0449.86.84.2.1使用選擇器和快速訪問器2.按行訪問實例演示按行訪問需要用選擇器loc和iloc,有多種形式,如表4-1所示。loc通過標簽來進行數(shù)據(jù)訪問iloc通過整數(shù)索引來進行數(shù)據(jù)訪問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按行對數(shù)據(jù)框切片按行索引切片In:df.loc['2024-01':'2024-02']Out:平安科技南方通信幸福銀行2024-0145.231.93.42024-0247.127.34.6#切片結(jié)果包含結(jié)束標簽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列交叉處的數(shù)據(jù)塊。4.2.1使用選擇器和快速訪問器3.切片實例演示同時按行索引、列索引切片有幾種變化的情況。(1)行、列同時切片。(2)僅按列切片。只切前面兩列的數(shù)據(jù)。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[]通過整數(shù)位置來訪問單個元素。In:df.iat[0,2]#行索引在前,列索引在后Out:3.44.2.2基于條件的數(shù)據(jù)篩選1.布爾索引實例演示序列和數(shù)據(jù)框都支持布爾索引,使用一個布爾值列表或序列對象來選擇對應位置為True的元素,在數(shù)據(jù)框中是選擇對應的行,語法格式為:對象[[True,False,…]]#對象是序列對象,或者數(shù)據(jù)框?qū)ο?,外層括號中可以是一個列表,也可以是一個序列對象,只要其中是布爾值。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基于條件的數(shù)據(jù)篩選2.關系運算實例演示序列對象可以進行關系運算,其結(jié)果是序列對象,元素值為布爾值。In:close>20Out:平安科技True南方通信True幸福銀行Falsedtype:bool4.2.2基于條件的數(shù)據(jù)篩選2.關系運算實例演示數(shù)據(jù)框選擇一列后也可以進行關系運算,其結(jié)果是序列對象,元素值為布爾值。In:df['平安科技']>47Out:2024-01False2024-02True2024-03False2024-04TrueName:平安科技,dtype:bool4.2.2基于條件的數(shù)據(jù)篩選3.基于條件的數(shù)據(jù)篩選實例演示把關系運算看作一個條件,可以直接把序列和數(shù)據(jù)框關系運算和布爾索引結(jié)合起來,形成基于條件的數(shù)據(jù)篩選。In:close[close>20]Out:平安科技44.3南方通信22.6In:df[df['平安科技']>47]Out:平安科技南方通信幸福銀行2024-0247.127.34.62024-0449.824.56.84.2.3多條件聯(lián)合篩選多條件的數(shù)據(jù)篩選實例演示當篩選條件多于一個時,可以通過邏輯運算符&(與)、|(或)進行組合,形成多條件聯(lián)合篩選。In:close[(close>20)&(close<40)]#每個條件都要用圓括號Out:南方通信22.6In:df[(df['平安科技']>47)&(df['南方通信']>26)]Out:平安科技南方通信幸福銀行2024-0247.127.34.64.3數(shù)據(jù)分組與聚合4.3.3分組后的數(shù)據(jù)轉(zhuǎn)換4.3.2對分組數(shù)據(jù)進行聚合操作4.3.1數(shù)據(jù)分組4.3數(shù)據(jù)分組與聚合根據(jù)一個或多個列的值,將數(shù)據(jù)分為若干組。然后對每組數(shù)據(jù)進行聚合操作,如匯總、統(tǒng)計、計算等操作。groupby()方法分組的列標簽功能實現(xiàn)參數(shù)示例數(shù)據(jù)姓名分區(qū)一季度二季度三季度四季度0趙四天河25723291438826721錢多黃埔28453161372336632孫冰越秀21003371390130243李萌黃埔44833810107023124周金天河41092322305640665吳達天河24354863157619346鄭華黃埔46631831145134567王軍越秀4839121436392649生成示例數(shù)據(jù)代碼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數(shù)據(jù)分組1.分組實例演示數(shù)據(jù)分組由數(shù)據(jù)框?qū)ο蟮膅roupby()方法完成,參數(shù)為分組的列標簽,生成一個分組對象,如按照“分區(qū)”分組的方法:In:group=df.groupby('分區(qū)')4.3.1數(shù)據(jù)分組2.查看分組實例演示生成一個分組對象,通過該對象可以查看分組情況。In:group.ngroups#ngroups為分組對象的屬性Out:3#數(shù)據(jù)框被分成了3組從結(jié)果可以看出,所有數(shù)據(jù)按照分區(qū)被分成了3組。4.3.1數(shù)據(jù)分組2.查看分組實例演示生成一個分組對象,通過該對象可以查看分組情況。In:group.size()#查看各分組的數(shù)量Out:分區(qū)天河3越秀2黃埔34.3.1數(shù)據(jù)分組2.查看分組實例演示生成一個分組對象,通過該對象可以查看分組情況。In:forname,gingroup:#遍歷各分組 print("分組名:",name) print(g)分組名:天河姓名分區(qū)一季度二季度三季度四季度0趙四天河25723291438826724周金天河41092322305640665吳達天河2435486315761934分組名:越秀姓名分區(qū)一季度二季度三季度四季度2孫冰越秀21003371390130247王軍越秀4839121436392649分組名:黃埔姓名分區(qū)一季度二季度三季度四季度1錢多黃埔28453161372336633李萌黃埔44833810107023126鄭華黃埔46631831145134564.3.2對分組數(shù)據(jù)進行聚合操作聚合操作可以將每個組的數(shù)據(jù)進行匯總、計算等,從而提取有用的信息。實現(xiàn):agg方法聚合操作以及對應的函數(shù)名稱為:求和(sum)、計數(shù)(count)、平均值(mean)、最大值(max)、最小值(min)等。4.3.2對分組數(shù)據(jù)進行聚合操作實例演示(1)對一個列標簽執(zhí)行一種聚合In:group.agg({'一季度':'sum'})#參數(shù)是一個字典,列標簽是鍵,操作名是值Out:一季度分區(qū)天河9116#結(jié)果代表天河區(qū)所有人的總和越秀6939黃埔1199114.3.2對分組數(shù)據(jù)進行聚合操作實例演示(2)對一個列標簽執(zhí)行多種聚合In:group.agg({'一季度':['sum','max']})#參數(shù)是操作名列表Out:一季度 summax分區(qū)天河91164109越秀69394839黃埔11991466324.3.2對分組數(shù)據(jù)進行聚合操作實例演示(3)對多個列標簽執(zhí)行多種聚合In:group.agg({'一季度':['sum','max'],'二季度':['mean','min']})#每個列標簽和操作構(gòu)成一個鍵值對Out:一季度二季度 summaxmeanmin分區(qū)天河911641093492.02322越秀693948392292.51214黃埔1199146632934.0183134.3.3分組后的數(shù)據(jù)轉(zhuǎn)換實例演示用groupby()對數(shù)據(jù)進行分組后,還可以通過數(shù)據(jù)轉(zhuǎn)換來修改或生成新的數(shù)據(jù)。實現(xiàn)transform()函數(shù)參數(shù)操作名字符串功能將操作應用到每一個分組,轉(zhuǎn)換后返回返回一個序列In:group['四季度'].transform('mean')#計算各區(qū)四季度的平均值。Out:02890.666667#表示天河區(qū)四季度的平均值13143.66666722836.50000033143.66666742890.66666752890.66666763143.66666772836.500000Name:四季度,dtype:float64transform()函數(shù)“每個分組數(shù)據(jù)在轉(zhuǎn)換后會被應用回原始DataFrame的相應位置”意思是標簽0、4、5對應的值為四季度天河區(qū)的平均值4.4合并和連接4.4.3數(shù)據(jù)框連接4.4.2合并方式4.4.1數(shù)據(jù)框合并4.4.1數(shù)據(jù)框合并實例演示merge()用來合并兩個數(shù)據(jù)框。參數(shù)on指定合并關鍵字。In:yu=pd.DataFrame({'學號':['201','202','203'],'語文':[91,82,93]})shu=pd.DataFrame({'學號':['203','202','201'],'數(shù)學':[94,85,96]})cheng=pd.merge(yu,shu,on='學號')chengOut:學號語文數(shù)學020191961202828522039394merge()方法

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

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

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

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

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

4.5數(shù)據(jù)讀取和存儲4.5.2讀寫Excel文件4.5.1讀寫CSV文件4.5.1讀寫CSV文件實例演示CSV(Comma-SeparatedValues,逗號分隔值)是一種常見的用于存儲表格數(shù)據(jù)的純文本格式。使用to_csv()和read_csv()函數(shù)可以實現(xiàn)CSV文件的存取。to_csv()是數(shù)據(jù)框的成員,要通過數(shù)據(jù)框?qū)ο笳{(diào)用。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,逗號分隔值)是一種常見的用于存儲表格數(shù)據(jù)的純文本格式。使用to_csv()和read_csv()函數(shù)可以實現(xiàn)CSV文件的存取。to_csv()是數(shù)據(jù)框的成員,要通過數(shù)據(jù)框?qū)ο笳{(diào)用。1.to_csv()方法

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

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

In:df=pd.read_csv('renshu.csv',index_col=0,sep='\t')根據(jù)文件內(nèi)容設置參數(shù)index_col和sep,如果文件第一列是索引,則設置參數(shù)index_col,否則不設置。根據(jù)文件的分隔符設置參數(shù)sep。4.5.2讀寫Excel文件實例演示to_excel()和read_excel()函數(shù)實現(xiàn)Excel文件的存取。to_excel()是數(shù)據(jù)框的成員,要通過數(shù)據(jù)框?qū)ο笳{(diào)用。1.to_excel()方法

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

In:df.to_excel('renshu.xlsx',sheet_name='學院',index=True)4.5.2讀寫Excel文件實例演示通過函數(shù)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')如要將兩個數(shù)據(jù)框?qū)ο骴f1和df2寫入一個工作簿workbook.xlsx,工作表名分別時表1和表2,則示例代碼如下4.5.2讀寫Excel文件實例演示read_excel()是pandas的成員,要通過pandas調(diào)用。read_excel()用于讀取Excel文件。參數(shù)sheet_name用于指定工作表名稱,如果讀取工作簿的第一個工作表,也可以不設置該參數(shù)。如果工作表包含索引,則設置參數(shù)index_col,否則不設置該參數(shù)。2.read_excel方法

In:df=pd.read_excel('renshu.xlsx',sheet_name='學院',index_col=0)4.6數(shù)據(jù)清洗和預處理4.6.1缺失值檢測與處理4.6.2異常值檢測與處理4.6.3重復值檢測與處理4.6.4數(shù)據(jù)類型轉(zhuǎn)換4.6.1缺失值檢測與處理實例演示isna()或isnull()方法用來檢測缺失值,返回一個布爾型的DataFrame,標識數(shù)據(jù)中哪些位置有缺失值。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()兩個函數(shù)的輸出結(jié)果相同Out:美好集團北方通信廣東科技一月FalseFalseFalse二月TrueTrueFalse三月FalseFalseTrue四月FalseFalseFalseTrue對應的位置有缺失值4.6.1缺失值檢測與處理實例演示處理缺失值的方式取決于數(shù)據(jù)分析的需求。常用的方法包括使用dropna()刪除包含缺失值的行或列2.處理缺失值

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

In:df.fillna(method='ffill')Out:美好集團北方通信廣東科技一月163.0113.0158.0二月163.0113.0119.0三月193.0127.0119.0四月109.0126.0110.0用缺失值前面的值填充。參數(shù)method='bfill'指定用后面的值填充缺失值。4.6.1缺失值檢測與處理實例演示處理缺失值的方式取決于數(shù)據(jù)分析的需求。常用的方法包括fillna()用特定值(如均值、中位數(shù)或前后值)填充缺失值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()函數(shù)異常值是指數(shù)據(jù)中偏離正常范圍的極端值,可能是由于測量錯誤、數(shù)據(jù)錄入錯誤或其他原因?qū)е碌?。這些異常值如果不加以處理,可能會影響計算的準確性和分析結(jié)果。1.異常值及其計算

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

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

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

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

實例演示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()函數(shù)可以快速生成規(guī)則的時間序列。例如,可以生成按天、按月、按年等遞增的時間序列。參數(shù)start指定起始日期,periods指定周期數(shù),freq指定頻率,D、M、Y分別表示天、月、年。1.date_range()函數(shù)

實例演示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()函數(shù)生成的對象是一個可迭代對象,可以通過索引訪問其中的每一個元素,元素是一個Timestamp對象。2.訪問Timestamp對象

實例演示In:dates[0]Out:Timestamp('2024-01-3100:00:00',freq='M')4.7.1時間序列生成與索引設置在時間序列處理中,通常將日期或時間列設置為索引,以便更好地操作、查詢、切片時間序列數(shù)據(jù)。如果數(shù)據(jù)中有日期時間列,但是以字符串的形式存儲,首先可以使用pd.to_datetime()函數(shù)將其轉(zhuǎn)換為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,'數(shù)量':num})dfOut:日期數(shù)量02024-8-181#數(shù)據(jù)框中有字符串形式的日期數(shù)據(jù)12024-8-27322024-8-36232024-8-45042024-8-58052024-8-69962024-8-78972024-8-85482024-8-96392024-8-10784.7.1時間序列生成與索引設置在時間序列處理中,通常將日期或時間列設置為索引,以便更好地操作、查詢、切片時間序列數(shù)據(jù)。如果數(shù)據(jù)中有日期時間列,但是以字符串的形式存儲,首先可以使用pd.to_datetime()函數(shù)將其轉(zhuǎn)換為datetime格式,然后通過set_index()設置該列為索引。3.將日期或時間列設置為索引

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

2024-08-0165#日期數(shù)據(jù)被設置成索引列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=['數(shù)量'])dfOut:數(shù)量2024-08-01762024-08-02852024-08-03952024-08-04962024-08-05912024-08-06832024-08-07902024-08-08772024-08-09862024-08-10604.7.2時間間隔計算與轉(zhuǎn)換時間間隔計算通常涉及兩個時間點或兩個時間序列之間的差異。pandas使用Timedelta對象來表示時間間隔。如果有兩個時間點,可以直接使用減法運算來計算它們之間的時間差,結(jié)果是一個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時間間隔計算與轉(zhuǎn)換對于整個時間序列,也可以通過類似的減法運算計算出每個時間點之間的差異。1.時間間隔計算

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

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

溫馨提示

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

評論

0/150

提交評論