Python數(shù)據(jù)分析與可視化(第2版) 教案 第3章 利用pandas進(jìn)行數(shù)據(jù)預(yù)處理_第1頁
Python數(shù)據(jù)分析與可視化(第2版) 教案 第3章 利用pandas進(jìn)行數(shù)據(jù)預(yù)處理_第2頁
Python數(shù)據(jù)分析與可視化(第2版) 教案 第3章 利用pandas進(jìn)行數(shù)據(jù)預(yù)處理_第3頁
Python數(shù)據(jù)分析與可視化(第2版) 教案 第3章 利用pandas進(jìn)行數(shù)據(jù)預(yù)處理_第4頁
Python數(shù)據(jù)分析與可視化(第2版) 教案 第3章 利用pandas進(jìn)行數(shù)據(jù)預(yù)處理_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

課題3.1數(shù)據(jù)的創(chuàng)建與操作課型講練授課班級大數(shù)據(jù)授課時數(shù)2教學(xué)目標(biāo)1.了解變量的含義。2.理解各種轉(zhuǎn)義符的作用。3.掌握格式化輸出的作用。4.理解各種運(yùn)算符的作用。教學(xué)重點(diǎn)1.理解各種轉(zhuǎn)義符的作用。2.掌握格式化輸出的作用。教學(xué)難點(diǎn)1.了解格式化輸出中,%的使用方法。學(xué)情分析本次課是Python復(fù)習(xí)的第一課,選取了Python中最基本的部分,也是在數(shù)據(jù)分析中經(jīng)常用到的一些方法。在用計算機(jī)求解問題的過程中,常常會用符號化的方法記錄客觀事實(shí),這些符號化的表示就是數(shù)據(jù)。計算中存在著數(shù)據(jù)的輸入與輸出,數(shù)據(jù)不同類型的轉(zhuǎn)換以及數(shù)據(jù)之間的各種運(yùn)算,這些都是程序設(shè)計語言的基本操作,通過這些基本操作可以實(shí)現(xiàn)一些簡單的功能。一、變量變量是計算機(jī)語言中能儲存計算結(jié)果或能表示值的抽象概念,一般而言,變量需要先定義后使用。例如C語言中的變量,必須在使用前確定變量的數(shù)據(jù)類型,但在Python卻有所不同,它是一種動態(tài)語言,對變量的每一次賦值,都可以改變變量的類型。需要注意的是,輸入字符串的時候,一般要字符串加上單引號或雙引號。變量主要類型如下表所示:表2-*變量類型表變量類型表示方法示例字符串class'str'"a"、'Python'整形數(shù)class'int'0、100浮點(diǎn)數(shù)class'float'5.02、10.00布爾值class'bool'True、False示例代碼如下:i=100j="a"k='Python'。m=5>4【結(jié)果分析】把數(shù)值100賦值給i,把字符a賦值變量j,把字符串Python賦值給變量k,把布爾值True賦值給變量m。二、轉(zhuǎn)義符在Python中,有些功能符號難以在輸出函數(shù)直接輸入,比如單引號和雙引號,因為Python會把單引號和雙引號里面的字符當(dāng)做字符串進(jìn)行處理,所以單引號和雙引號僅僅是字符串輸入的默認(rèn)符號。如果想要輸出單引號和雙引號,就不能直接輸入,而是要用轉(zhuǎn)義符。轉(zhuǎn)義符是指具有特定的含義的符號,不同于字符原有的意義,所以稱為轉(zhuǎn)義符。轉(zhuǎn)義符一般用“\”開頭,后面跟一個或幾個符號,表示不同的含義。如\n并不會真的輸出\n,而是輸出一個換行符。常用的轉(zhuǎn)義符及其含義如表表2-*所示。表2-*轉(zhuǎn)義符表\n換行符\t制表符Tab\\反斜杠\\'單引號'\"雙引號"三、輸出與輸入一般來說,程序都會有輸入和輸出,這樣用戶才能與計算機(jī)進(jìn)行交互。在Python中可以使用input函數(shù)進(jìn)行輸入,而使用print函數(shù)進(jìn)行輸出。1.輸入函數(shù)input是Python獲取輸入信息的函數(shù),運(yùn)行函數(shù)后,可以獲取鍵盤中輸入信息,信息默認(rèn)為字符串類型。輸入函數(shù)input的一般格式為:input([提示字符串])其中,中括號中的“提示字符串”是可選項。示例代碼如下:name=input("Pleaseinputyourname:")【結(jié)果分析】name變量就是字符型變量。在Python中,如果想要將輸入的字符串類型轉(zhuǎn)換為整數(shù)型,還可以通過int來實(shí)現(xiàn),其一般格式為:int(input([提示字符串]))其中,int函數(shù)表示將字符串轉(zhuǎn)換為整型。示例代碼如下:age=int(input("Pleaseinputyourage:"))【結(jié)果分析】age變量就是數(shù)值型變量。2.輸出函數(shù)(1)print函數(shù)print函數(shù)是Python的基本輸出函數(shù),print函數(shù)可以將指定的消息打印到屏幕上。該消息可以是字符串,也可以是任何其他對象,該對象在打印到屏幕之前會被轉(zhuǎn)換為字符串。print函數(shù)有著非常靈活的使用方法,input的一般格式為:print(str,[end='\n'])其中,參數(shù)str表示要輸出的內(nèi)容,str是可以是字符串也可以是變量。參數(shù)end表示結(jié)束符,默認(rèn)為換行符(\n),即利用print進(jìn)行輸出默認(rèn)帶有換行符,如果不想以換行符結(jié)束輸出,可以使用end='\t'(Tab鍵)、或end=''(空格)等結(jié)束輸出。示例代碼如下:print("helloworld!")str="helloworld!"print(str)代碼與結(jié)果如圖2-*所示。圖2-*print輸出函數(shù)示例結(jié)果Print還有一種輸出方式,就是字符串后面再接變量,示例代碼如下:a=20print("age=",a)輸出結(jié)果為:圖2-*print輸出函數(shù)示例結(jié)果(2)格式化輸出在很多應(yīng)用場景中,對輸出是有嚴(yán)格要求的,如在某些報表統(tǒng)計中,需要控制小數(shù)點(diǎn)位數(shù),此時就不能直接輸出原始數(shù)據(jù),而是要對數(shù)據(jù)的格式進(jìn)行控制,這就是格式化輸出。格式化輸出除了可以控制輸出的格式之外,還有一個好處就是可以只通過一個print函數(shù)在一個字符串內(nèi)輸出多個變量。在Python中,格式化輸出時,需要使用%分隔字符串和輸出變量,一般格式為:字符串%(輸出變量1,輸出變量2,…)其中,字符串有兩個部分組成,一個是普通字符串,另一個是格式說明符。普通字符串可以直接輸出,而格式說明符是以%開頭,并且決定了輸出變量的格式。格式說明符的具體用法如表2-*所示。表2-*格式化輸出具體用法格式說明符格式化結(jié)果%%%%s字符串%i或%d整數(shù)%f浮點(diǎn)數(shù)四、算術(shù)運(yùn)算符算術(shù)運(yùn)算可以對數(shù)據(jù)進(jìn)行各種算術(shù)操作,算術(shù)操作可以用一些符號來表示,這些符號被稱為算術(shù)運(yùn)算符,“先乘除后加減”就反映了乘除運(yùn)算的優(yōu)先級比加減運(yùn)算高。Python的算術(shù)運(yùn)算符有:+(加)、-(減)、*(乘)、/(除)、//(除整)、%(求余)和**(乘方)?!?”表示除法,如:7/2,結(jié)果為3.5?!?/”表示兩個數(shù)相除后得到的商的整數(shù)部分,如:7//2,結(jié)果為3?!?”表示兩個數(shù)相除后得到的余數(shù),如:7%2,返回1?!?*”表示乘方,如:7**2,返回49。示例代碼如下:print("7除以2的結(jié)果為:",7/2)print("7除以2的商的整數(shù)部分為:",7//2)print("7除以2的余數(shù)為:",7%2)print("7的平方為:",7**2)輸出結(jié)果如圖2-*所示。圖2-*算術(shù)運(yùn)算符應(yīng)用結(jié)果任務(wù)實(shí)訓(xùn)任務(wù)1:通過輸入提示符“請輸入姓名”和“請輸入年齡”,利用鍵盤輸入“王飛”和20,并將兩個輸入的值賦值給兩個變量“name”和“age”,再利用type函數(shù)輸出兩個變量的類型。具體代碼如下:name=input("請輸入姓名:")age=int(input("請輸入年齡:"))print("姓名=",name)print("name變量的類型為:",type(name))print("年齡=",age)print("age變量的類型為:",type(age))輸出結(jié)果如圖2-*所示。圖2-*任務(wù)1代碼及輸出結(jié)果【結(jié)果分析】class'str'表示字符串類型,class'int'表示整型數(shù)值。任務(wù)2:導(dǎo)入math模塊,利用輸出math.pi圓周率并賦值給變量p,輸出變量p的類型,再利用格式化格式化輸出圓周率的2位小數(shù)和5位小數(shù)。具體代碼如下:importmathp=math.piprint("p=",p)print("p的類型為:",type(p))print("保留2位小數(shù)的圓周率的結(jié)果=%.2f\n保留5位小數(shù)的圓周率的結(jié)果=%.5f"%(p,p))輸出結(jié)果如圖2-*所示。圖2-*格式化輸出示例結(jié)果任務(wù)3:通過input函數(shù)輸入一個三位數(shù),輸出這個三位數(shù)的百位、十位和個位。具體代碼如下:n=int(input("請輸入一個三位數(shù):"))n_g=n%10#n除以10后得到的余數(shù)就是個位n_s=n//10%10#n//10表示n除以10得到的商的整數(shù)部分,即前兩位,再除以10得到的余數(shù)就是十位n_b=n//100#n除以100得到的商的整數(shù)部分就是百位print("百位數(shù)為:%i\n十位數(shù)為:%i\n個位數(shù)為:%i\n"%(n_b,n_s,n_g))輸出結(jié)果如圖2-*所示。圖2-*任務(wù)3輸出結(jié)果課題3.2數(shù)據(jù)的導(dǎo)入與保存課型講練授課班級大數(shù)據(jù)授課時數(shù)2教學(xué)目標(biāo)1.能夠?qū)?dǎo)入的數(shù)據(jù)進(jìn)行顯示屬性的設(shè)置。2.能夠?qū)雝xt格式的數(shù)據(jù)。3.能夠?qū)雃xcel格式的數(shù)據(jù)。教學(xué)重點(diǎn)1.能夠?qū)雝xt格式的數(shù)據(jù)。2.能夠?qū)雃xcel格式的數(shù)據(jù)。教學(xué)難點(diǎn)1.能夠?qū)?dǎo)入的數(shù)據(jù)進(jìn)行顯示屬性的設(shè)置。學(xué)情分析分析的數(shù)據(jù)大部分情況下都是通過數(shù)據(jù)導(dǎo)入得到的,因為導(dǎo)入txt和導(dǎo)入excel十分重要,但是要主要的是兩種導(dǎo)入函數(shù)還是有一些差別的。在用計算機(jī)求解問題的過程中,常常會用符號化的方法記錄客觀事實(shí),這些符號化的表示就是數(shù)據(jù)。計算中存在著數(shù)據(jù)的輸入與輸出,數(shù)據(jù)不同類型的轉(zhuǎn)換以及數(shù)據(jù)之間的各種運(yùn)算,這些都是程序設(shè)計語言的基本操作,通過這些基本操作可以實(shí)現(xiàn)一些簡單的功能。一、變量變量是計算機(jī)語言中能儲存計算結(jié)果或能表示值的抽象概念,一般而言,變量需要先定義后使用。例如C語言中的變量,必須在使用前確定變量的數(shù)據(jù)類型,但在Python卻有所不同,它是一種動態(tài)語言,對變量的每一次賦值,都可以改變變量的類型。需要注意的是,輸入字符串的時候,一般要字符串加上單引號或雙引號。變量主要類型如下表所示:表2-*變量類型表變量類型表示方法示例字符串class'str'"a"、'Python'整形數(shù)class'int'0、100浮點(diǎn)數(shù)class'float'5.02、10.00布爾值class'bool'True、False示例代碼如下:i=100j="a"k='Python'。m=5>4【結(jié)果分析】把數(shù)值100賦值給i,把字符a賦值變量j,把字符串Python賦值給變量k,把布爾值True賦值給變量m。二、轉(zhuǎn)義符在Python中,有些功能符號難以在輸出函數(shù)直接輸入,比如單引號和雙引號,因為Python會把單引號和雙引號里面的字符當(dāng)做字符串進(jìn)行處理,所以單引號和雙引號僅僅是字符串輸入的默認(rèn)符號。如果想要輸出單引號和雙引號,就不能直接輸入,而是要用轉(zhuǎn)義符。轉(zhuǎn)義符是指具有特定的含義的符號,不同于字符原有的意義,所以稱為轉(zhuǎn)義符。轉(zhuǎn)義符一般用“\”開頭,后面跟一個或幾個符號,表示不同的含義。如\n并不會真的輸出\n,而是輸出一個換行符。常用的轉(zhuǎn)義符及其含義如表表2-*所示。表2-*轉(zhuǎn)義符表\n換行符\t制表符Tab\\反斜杠\\'單引號'\"雙引號"三、輸出與輸入一般來說,程序都會有輸入和輸出,這樣用戶才能與計算機(jī)進(jìn)行交互。在Python中可以使用input函數(shù)進(jìn)行輸入,而使用print函數(shù)進(jìn)行輸出。1.輸入函數(shù)input是Python獲取輸入信息的函數(shù),運(yùn)行函數(shù)后,可以獲取鍵盤中輸入信息,信息默認(rèn)為字符串類型。輸入函數(shù)input的一般格式為:input([提示字符串])其中,中括號中的“提示字符串”是可選項。示例代碼如下:name=input("Pleaseinputyourname:")【結(jié)果分析】name變量就是字符型變量。在Python中,如果想要將輸入的字符串類型轉(zhuǎn)換為整數(shù)型,還可以通過int來實(shí)現(xiàn),其一般格式為:int(input([提示字符串]))其中,int函數(shù)表示將字符串轉(zhuǎn)換為整型。示例代碼如下:age=int(input("Pleaseinputyourage:"))【結(jié)果分析】age變量就是數(shù)值型變量。2.輸出函數(shù)(1)print函數(shù)print函數(shù)是Python的基本輸出函數(shù),print函數(shù)可以將指定的消息打印到屏幕上。該消息可以是字符串,也可以是任何其他對象,該對象在打印到屏幕之前會被轉(zhuǎn)換為字符串。print函數(shù)有著非常靈活的使用方法,input的一般格式為:print(str,[end='\n'])其中,參數(shù)str表示要輸出的內(nèi)容,str是可以是字符串也可以是變量。參數(shù)end表示結(jié)束符,默認(rèn)為換行符(\n),即利用print進(jìn)行輸出默認(rèn)帶有換行符,如果不想以換行符結(jié)束輸出,可以使用end='\t'(Tab鍵)、或end=''(空格)等結(jié)束輸出。示例代碼如下:print("helloworld!")str="helloworld!"print(str)代碼與結(jié)果如圖2-*所示。圖2-*print輸出函數(shù)示例結(jié)果Print還有一種輸出方式,就是字符串后面再接變量,示例代碼如下:a=20print("age=",a)輸出結(jié)果為:圖2-*print輸出函數(shù)示例結(jié)果(2)格式化輸出在很多應(yīng)用場景中,對輸出是有嚴(yán)格要求的,如在某些報表統(tǒng)計中,需要控制小數(shù)點(diǎn)位數(shù),此時就不能直接輸出原始數(shù)據(jù),而是要對數(shù)據(jù)的格式進(jìn)行控制,這就是格式化輸出。格式化輸出除了可以控制輸出的格式之外,還有一個好處就是可以只通過一個print函數(shù)在一個字符串內(nèi)輸出多個變量。在Python中,格式化輸出時,需要使用%分隔字符串和輸出變量,一般格式為:字符串%(輸出變量1,輸出變量2,…)其中,字符串有兩個部分組成,一個是普通字符串,另一個是格式說明符。普通字符串可以直接輸出,而格式說明符是以%開頭,并且決定了輸出變量的格式。格式說明符的具體用法如表2-*所示。表2-*格式化輸出具體用法格式說明符格式化結(jié)果%%%%s字符串%i或%d整數(shù)%f浮點(diǎn)數(shù)四、算術(shù)運(yùn)算符算術(shù)運(yùn)算可以對數(shù)據(jù)進(jìn)行各種算術(shù)操作,算術(shù)操作可以用一些符號來表示,這些符號被稱為算術(shù)運(yùn)算符,“先乘除后加減”就反映了乘除運(yùn)算的優(yōu)先級比加減運(yùn)算高。Python的算術(shù)運(yùn)算符有:+(加)、-(減)、*(乘)、/(除)、//(除整)、%(求余)和**(乘方)?!?”表示除法,如:7/2,結(jié)果為3.5?!?/”表示兩個數(shù)相除后得到的商的整數(shù)部分,如:7//2,結(jié)果為3?!?”表示兩個數(shù)相除后得到的余數(shù),如:7%2,返回1?!?*”表示乘方,如:7**2,返回49。示例代碼如下:print("7除以2的結(jié)果為:",7/2)print("7除以2的商的整數(shù)部分為:",7//2)print("7除以2的余數(shù)為:",7%2)print("7的平方為:",7**2)輸出結(jié)果如圖2-*所示。圖2-*算術(shù)運(yùn)算符應(yīng)用結(jié)果任務(wù)實(shí)訓(xùn)任務(wù)1:通過輸入提示符“請輸入姓名”和“請輸入年齡”,利用鍵盤輸入“王飛”和20,并將兩個輸入的值賦值給兩個變量“name”和“age”,再利用type函數(shù)輸出兩個變量的類型。具體代碼如下:name=input("請輸入姓名:")age=int(input("請輸入年齡:"))print("姓名=",name)print("name變量的類型為:",type(name))print("年齡=",age)print("age變量的類型為:",type(age))輸出結(jié)果如圖2-*所示。圖2-*任務(wù)1代碼及輸出結(jié)果【結(jié)果分析】class'str'表示字符串類型,class'int'表示整型數(shù)值。任務(wù)2:導(dǎo)入math模塊,利用輸出math.pi圓周率并賦值給變量p,輸出變量p的類型,再利用格式化格式化輸出圓周率的2位小數(shù)和5位小數(shù)。具體代碼如下:importmathp=math.piprint("p=",p)print("p的類型為:",type(p))print("保留2位小數(shù)的圓周率的結(jié)果=%.2f\n保留5位小數(shù)的圓周率的結(jié)果=%.5f"%(p,p))輸出結(jié)果如圖2-*所示。圖2-*格式化輸出示例結(jié)果任務(wù)3:通過input函數(shù)輸入一個三位數(shù),輸出這個三位數(shù)的百位、十位和個位。具體代碼如下:n=int(input("請輸入一個三位數(shù):"))n_g=n%10#n除以10后得到的余數(shù)就是個位n_s=n//10%10#n//10表示n除以10得到的商的整數(shù)部分,即前兩位,再除以10得到的余數(shù)就是十位n_b=n//100#n除以100得到的商的整數(shù)部分就是百位print("百位數(shù)為:%i\n十位數(shù)為:%i\n個位數(shù)為:%i\n"%(n_b,n_s,n_g))輸出結(jié)果如圖2-*所示。圖2-*任務(wù)3輸出結(jié)果課題3.3數(shù)據(jù)的新增與刪除課型講練授課班級大數(shù)據(jù)授課時數(shù)2教學(xué)目標(biāo)1.能夠利用多種方法按列新增數(shù)據(jù)。2.能夠利用按列或按行刪除數(shù)據(jù)。教學(xué)重點(diǎn)1.能夠利用多種方法按列新增數(shù)據(jù)。2.能夠利用按列或按行刪除數(shù)據(jù)。教學(xué)難點(diǎn)1.能夠利用按列或按行刪除數(shù)據(jù)。學(xué)情分析刪除行或列的數(shù)據(jù)時,需要使用axis參數(shù)進(jìn)行控制,這一點(diǎn)很容易被學(xué)生忽略。DataFrame作為一種二維表的數(shù)據(jù)結(jié)構(gòu),能夠像數(shù)據(jù)庫一樣實(shí)現(xiàn)增加和刪除操作,如增刪行或增刪列,在實(shí)際應(yīng)用新增列的情況比較多。一、新增列數(shù)據(jù)在DataFrame中,添加一列有多種方法。而在新建列的時候,首先需要先創(chuàng)建一個列名,再通過直接賦值、公式計算或函數(shù)等方法生成列數(shù)據(jù)。比如可以根據(jù)單價和數(shù)量計算出總價,再比如根據(jù)地區(qū)提取出省份和城市等。1.利用直接賦值生成新列數(shù)據(jù)利用直接賦值生成新列數(shù)據(jù)最為簡單,只需要將值賦給新列即可,其一般格式為:DataFrame[new_column]=value示例代碼如下:importnumpyasnpimportpandasaspddata=pd.DataFrame(np.arange(1,10).reshape(3,3),columns=['a','b','c'],index=['001','002','003'])print("初始數(shù)據(jù)為:\n",data)data['d']='2020-02-02'print(通過直接賦值新增列數(shù)據(jù)的結(jié)果為:\n",data)輸出結(jié)果如圖3-*所示。圖3-*利用直接賦值生成新列數(shù)據(jù)示例結(jié)果2.利用公式計算生成新列數(shù)據(jù)利用兩列數(shù)據(jù)或多列數(shù)據(jù),通過運(yùn)算符經(jīng)過公式計算也可生成新列數(shù)據(jù),其一般格式為:DataFrame[new_column]=DataFrame[column1](+-*/)DataFrame[column2](+-*/)…示例代碼如下:data['e']=data['a']+data['b']+data['c']print("通過公式計算機(jī)新增列數(shù)據(jù)的結(jié)果為:\n",data)輸出結(jié)果如圖3-*所示。圖3-*利用公式計算生成新列數(shù)據(jù)示例結(jié)果3.利用字符串拆分生成新列數(shù)據(jù)除了可以通過直接賦值和公式計算生成列數(shù)據(jù)以外,還可以通過字符串的拆分方法str.split生成新列數(shù)據(jù),其一般格式為:DataFrame[new_column]=DataFrame[column].str.split(sep,expand)其中,sep表示分隔符,如逗號(,)、分號(;)、tab(\t)、豎線(|)等。Expand表示是否把切割出來的內(nèi)容生成新列,如果要生成新列,則使用expand=True,如果不需生成新列,就可以使用False。當(dāng)DataFrame某一列被拆分后,可用str.split(sep,expand)[i](i=0,1,2,……)來表示拆分后的分列數(shù)據(jù)。str.split(sep,expand)[0]表示拆分后的第1列的數(shù)據(jù),str.split(sep,expand)[1]表示拆分后的第2列數(shù)據(jù),以此類推。示例代碼如下:data['year']=data['d'].str.split('-',expand=True)[0]data['month']=data['d'].str.split('-',expand=True)[1]print("通過字符串拆分新增列數(shù)據(jù)的結(jié)果為:\n",data)輸出結(jié)果如圖3-*所示。二、數(shù)據(jù)的刪除在DataFrame中,如果不需要某些行或某些列,可以使用drop函數(shù)刪除數(shù)據(jù)。drop函數(shù)的一般格式為:DataFrame.drop(labels,axis,inplace)其中,各個參數(shù)如下:labels表示表示刪除的行或列的標(biāo)簽。axis表示刪除的行還是列,axis=0表示行,axis=1表示列。在根據(jù)行索引刪除多行數(shù)據(jù)時,可以使用列表表示行索引。如刪除第3行和第7行,可用labels=[3,7]。如果刪除第4行到第6行,可用labels=[4,5,6],或者用range函數(shù)來表示,即labels=range(4,7)。inplace表示刪除結(jié)果是否替換原表,即刪除結(jié)果是否在原表顯示,inplace=True表示操作在原表生效,inplace=False表示操作在新表生效。默認(rèn)是False,即如果要在新表生效,可以不設(shè)置該參數(shù)。一定需要注意的是,如果使用inplace=False,必須要把結(jié)果賦給一個新的DataFrame,否則就看不到任何效果。示例代碼如下:print("data數(shù)據(jù)為:\n",data)data.drop(labels='e',axis=1,inplace=True)print("刪除e列后結(jié)果在原表示的結(jié)果為:\n",data)data_new=data.drop(labels='001',axis=0,inplace=False)print("刪除行索引為001后結(jié)果在新表示的結(jié)果為:\n",data_new)輸出結(jié)果如圖3-*所示。圖3-*數(shù)據(jù)的刪除示例結(jié)果任務(wù)實(shí)訓(xùn)任務(wù)1:利用read_excel導(dǎo)入supermarket.xlsx(supermarket.xlsx存放在c:\data路徑中)中的“銷售統(tǒng)計”工作表(第1張工作表),數(shù)據(jù)命名為data1,任務(wù)1源數(shù)據(jù)如圖3-*所示。圖3-*任務(wù)1源數(shù)據(jù)(部分)完成:(1)生成新列“支付方式”,全部賦值“銀行轉(zhuǎn)賬”。(2)生成新列“銷售金額”,計算公式為“銷售金額”=“單價”*“數(shù)量”。(3)根據(jù)“客戶”列生成“客戶姓名”和“客戶ID”。具體代碼如下:pd.set_option('display.max_columns',12)#設(shè)置顯示的最大列數(shù)為12列pd.set_option('display.width',None)#設(shè)置不限制顯示寬度pd.set_option('display.unicode.east_asian_width',True)#設(shè)置數(shù)據(jù)與列名對齊data1=pd.read_excel('c:\data\supermarket.xlsx')data1['支付方式']='銀行轉(zhuǎn)賬'data1['銷售金額']=data1['單價']*data1['數(shù)量']data1['客戶姓名']=data1['客戶'].str.split('-',expand=True)[0]data1['客戶ID']=data1['客戶'].str.split('-',expand=True)[1]print("data1的數(shù)據(jù)為:\n",data1.head())輸出結(jié)果如圖3-*所示。圖3-*任務(wù)1輸出結(jié)果任務(wù)2:根據(jù)任務(wù)1完成的data1,完成:(1)利用重設(shè)索引set_index,將datat1的“客戶ID”設(shè)為索引,并命名為data2。(2)刪除行索引“客戶ID”為“17170”的行,再刪除“子類別”列和“客戶”列,結(jié)果重新命名為data2_new。具體代碼如下:data2=data1.set_index(data1['客戶ID'])print("根據(jù)data1重設(shè)索引后的data2為:\n",data2.head())data2.drop(labels='17170',axis=0,inplace=True)data2_new=data2.drop(labels=['子類別','客戶'],axis=1)print("刪除指定行與列后的結(jié)果為:\n",data2_new.head())輸出結(jié)果如圖3-*所示。圖3-*任務(wù)2輸出結(jié)果鞏固訓(xùn)練根據(jù)導(dǎo)入的數(shù)據(jù)data1,完成:(1)將“地區(qū)”列拆分為“省份”列和“城市”列。(2)生成新列“折扣金額”,計算公式為“折扣金額”=“銷售金額”*(1-“折扣”)。(3)刪除索引號5到10的行,再刪除“地區(qū)”列。課題3.4數(shù)據(jù)的篩選與切片課型講練授課班級大數(shù)據(jù)授課時數(shù)2教學(xué)目標(biāo)1.能夠直接選取列數(shù)據(jù)或行數(shù)據(jù)。2.能夠利用loc函數(shù)選取數(shù)據(jù)。3.能夠利用iloc函數(shù)選取數(shù)據(jù)。教學(xué)重點(diǎn)1.能夠選取列數(shù)據(jù)或行數(shù)據(jù)。教學(xué)難點(diǎn)1.理解利用loc函數(shù)和iloc函數(shù)選取數(shù)據(jù)的區(qū)別。學(xué)情分析選取數(shù)據(jù)是數(shù)據(jù)預(yù)處理中一種簡單的操作,難度不是很大。在對數(shù)據(jù)做相應(yīng)操作之前,應(yīng)先篩選出所需的數(shù)據(jù),pandas里最常用的結(jié)構(gòu)DataFrame就是一個二維表,行和列的設(shè)計很便于數(shù)據(jù)的選取。DataFrame的索引有兩種,行索引用index來表示,列索引用columns表示,而在選取行數(shù)據(jù)、列數(shù)據(jù)或是切片DataFrame數(shù)據(jù)時,都會使用這兩個索引。一、直接選取列數(shù)據(jù)通過用二維嵌套字典可以創(chuàng)建DataFrame,并且將列數(shù)據(jù)看成是外層字典,而將行數(shù)據(jù)看成是內(nèi)層字典。按照字典的訪問方式就可以訪問DataFrame的數(shù)據(jù),如果是輸入字典的關(guān)鍵字,默認(rèn)返回的就是外層字典的數(shù)據(jù)。在DataFrame后面直接跟關(guān)鍵字,默認(rèn)就返回該關(guān)鍵字對應(yīng)列數(shù)據(jù)。利用字典方式選取列數(shù)據(jù)有兩種,一種時選取單列,另一種時選取多列。1.選取單列在DataFrame中,每一列數(shù)據(jù)的查詢可以通過列名讀取來實(shí)現(xiàn),選取單列的一般格式為:DataFrame[column]其中,column表示單列的名稱。2.選取多列在DataFrame中,訪問多列數(shù)據(jù)需要將多個列名columns放入一個列表[]中,選取多列的一般格式為:DataFrame[[columns]]其中,columns表示多列的名稱。示例代碼如下:importnumpyasnpimportpandasaspddata=pd.DataFrame(np.arange(1,10).reshape(3,3),columns=['a','b','c'],index=['001','002','003'])print("初始數(shù)據(jù)為:\n",data)print("選取b列的列數(shù)據(jù)為:\n",data['b'])print("選取a列和c列的列數(shù)據(jù)為:\n",data[['a','c']])輸出結(jié)果如圖3-*所示。圖3-*選取單列和多列示例結(jié)果二、利用loc函數(shù)選取行數(shù)據(jù)1.利用行索引選取數(shù)據(jù)在DataFrame中,如果選取行數(shù)據(jù),不能直接用行索引進(jìn)行選取,而是需要使用loc函數(shù)進(jìn)行選取,loc函數(shù)的一般用法是:DataFrame.loc[Auto_index]或DataFrame.loc[set_index]其中,Auto_index表示自動生成的行索引,set_index表示用戶設(shè)置的行索引。(1)利用自動生成的行索引選取數(shù)據(jù)利用自動生成的行索引選取數(shù)據(jù)的一般用法為:DataFrame.loc[Auto_index]其中,Auto_index可以是單個索引,也可以是多個不連續(xù)或連續(xù)的索引。選取多個不連續(xù)索引時,需要將這些索引放入一個列表[]中。選取多個連續(xù)索引時,可以用冒號“:”連接起始索引和終止索引,并且起始索引和終止索引都是可以取到的。示例代碼如下:print("初始數(shù)據(jù)為:\n",data)print("選取自動行索引為002的行數(shù)據(jù)為:\n",data.loc['002'])print("選取自動行索引為001和003的行數(shù)據(jù)為:\n",data.loc[['001','003']])print("選取自動行索引為001到003的行數(shù)據(jù)為:\n",data.loc['001':'003'])輸出結(jié)果如圖3-*所示。圖3-*利用自動生成的行索引選取數(shù)據(jù)示例結(jié)果(2)利用生成的索引選取數(shù)據(jù)除了利用自動生成索引選取數(shù)據(jù)以外,還可以利用用戶生成的索引選取數(shù)據(jù),其一般用法為:DataFrame.loc[set_index]其中,set_index表示用戶設(shè)置的行索引。示例代碼如下:data['d']=['2020-1-1','2020-1-2','2020-1-3']data=data.set_index('d') #利用set_index將d列設(shè)置為行索引print("增加d列并重設(shè)索引的數(shù)據(jù)為:\n",data)print("選取行索引為2020-1-2的行數(shù)據(jù)為:\n",data.loc['2020-1-2'])print("選取行索引為2020-1-1和2020-1-3的行數(shù)據(jù)為:\n",data.loc[['2020-1-1','2020-1-3']])輸出結(jié)果如圖3-*所示。圖3-*利用生成的索引列選取數(shù)據(jù)示例結(jié)果2.利用行篩選條件選取數(shù)據(jù)在DataFrame中,除了可以利用行索引選取行數(shù)據(jù)以外,還可以利用loc函數(shù)設(shè)置篩選條件選取行數(shù)據(jù),比如篩選性別為“男”的行數(shù)據(jù),或是地區(qū)為“蘇州”的行數(shù)據(jù)等。利用loc函數(shù)設(shè)置行篩選條件選取行數(shù)據(jù)的一般方法為:DataFrame.loc[行篩選條件]其中,如果存在多個行篩選條件,可以使用“&”等連接符進(jìn)行連接,而且將每個行篩選條件都寫在括號()內(nèi)。示例代碼如下:data=data.reset_index()#利用reset_index將設(shè)置的索引還原成自動行索引print("還原成自動行索引后的數(shù)據(jù)為:\n",data)print("d列的值為2020-1-1的結(jié)果為:\n",data.loc[data['d']=='2020-1-1'])輸出結(jié)果如圖3-*所示。圖3-*利用行篩選條件選取數(shù)據(jù)示例結(jié)果三、選取DataFrame切片數(shù)據(jù)在DataFrame中,除了可以單獨(dú)選列數(shù)據(jù)或行數(shù)據(jù)以外,還可以選取多列多行的數(shù)據(jù),即DataFrame切片數(shù)據(jù),DataFrame切片數(shù)據(jù)可以通過多種方式進(jìn)行實(shí)現(xiàn),既可以通過類似于二維字典數(shù)據(jù)選取的方法,即雙重索引的方法,也可以通過loc函數(shù)或iloc函數(shù)。1.使用雙重索引直接選取數(shù)據(jù)利用雙重索引(先列后行)選取DataFrame切片數(shù)據(jù)的原理是通過DataFrame[[columns]]選出需要的多列,再通過[index]選出需要的行,其一般方法為:DataFrame[[columns]][index]示例代碼如下:data=pd.DataFrame(np.arange(1,17).reshape(4,4),columns=['a','b','c','d'],index=['001','002','003','004'])print("初始數(shù)據(jù)為:\n",data)print("行索引為001列003,a列與c列的結(jié)果為:\n",data[['a','c']]['001':'003'])輸出結(jié)果如圖3-*所示。圖3-*使用雙重索引直接選?。ㄏ攘泻笮校┦纠Y(jié)果2.使用loc函數(shù)選取數(shù)據(jù)loc函數(shù)不但可以單獨(dú)選取行數(shù)據(jù),而且還可以選取DataFrame切片數(shù)據(jù)(先行后列),其一般方法為:DataFrame.loc[index,[columns]]或DataFrame.loc[行篩選條件,[columns]]其中,index可以是單個索引,也可以是多個不連續(xù)或連續(xù)的索引。選取多個不連續(xù)索引時,需要將這些索引放入一個列表[]中。選取多個連續(xù)索引時,可以用冒號“:”連接起始始索引和終止索引,并且起始索引和終止索引都是可以取到的。如果columns是多列,需要將多個列名要放入一個列表[]中。示例代碼如下:print("初始數(shù)據(jù)為:\n",data)print("行索引為001列003,a列與c列的結(jié)果為:\n",data.loc['001':'003',['a','c']])print("行索引為001與003,a列與c列的結(jié)果為:\n",data.loc[['001','003'],['a','c']])print("滿足a列的值大于3的行數(shù)據(jù)中,再選擇a列、b列、c列的結(jié)果為:\n",data.loc[data['a']>3,['a','b','c']])輸出結(jié)果如圖3-*所示。圖3-*使用loc選取數(shù)據(jù)示例結(jié)果3.使用iloc函數(shù)選取數(shù)據(jù)iloc函數(shù)是按照行(index)與列(column)的位置來進(jìn)行選取數(shù)據(jù),iloc不管行與列的具體值是多少,只和位置有關(guān)。iloc函數(shù)的一般用法為:iloc[index_num,columns_num]其中,index_num和columns_num只能使用數(shù)值,對應(yīng)的行索引和列索引的編號,而要注意行索引和列索引都是從0開始編號。index_num和columns_num可以只有一個數(shù)字,也可以是一個范圍,并且范圍都是左閉右開區(qū)間,即右端點(diǎn)索引對應(yīng)的行或列是不能取到的,這一點(diǎn)loc函數(shù)是有所不同的。示例代碼如下:print("初始數(shù)據(jù)為:\n",data)print("行索引編號1到3,列索引編號0到2的數(shù)據(jù)為:\n",data.iloc[1:4,0:3])輸出結(jié)果如圖3-*所示。圖3-*使用iloc選取數(shù)據(jù)示例結(jié)果任務(wù)實(shí)訓(xùn)任務(wù)1:利用read_excel導(dǎo)入supermarket.xlsx(supermarket.xlsx存放在c:\data路徑中)中的“銷售統(tǒng)計”工作表(第1張工作表),并將“客戶ID”設(shè)為索引列,將導(dǎo)入數(shù)據(jù)的前3行命名為data1,并完成:(1)選取“產(chǎn)品名稱”列的數(shù)據(jù)。(2)選取“訂單日期”、“發(fā)貨日期”兩列的數(shù)據(jù)。(3)選取“客戶編號”為“10165”的行數(shù)據(jù)。(4)選取“城市”為“內(nèi)江”并且“銷售金額”大于100的數(shù)據(jù)。任務(wù)1(1)具體代碼如下:pd.set_option('display.max_columns',None)pd.set_option('display.width',None)pd.set_option('display.unicode.east_asian_width',True)data1=pd.read_excel('c:\data\supermarket.xlsx',index_col='客戶ID').head(3)print("導(dǎo)入的數(shù)據(jù)為:\n",data1)print("選取'產(chǎn)品名稱'列的數(shù)據(jù)為:\n",data1['產(chǎn)品名稱'])輸出結(jié)果如圖3-*所示。圖3-*任務(wù)1(1)輸出結(jié)果任務(wù)1(2)具體代碼如下:print("選取'訂單日期'列和'發(fā)貨日期'的數(shù)據(jù)為:\n",data1[['訂單日期','發(fā)貨日期']])輸出結(jié)果如圖3-*所示。圖3-*任務(wù)1(2)輸出結(jié)果任務(wù)1(3)具體代碼如下:print("選取'客戶ID'為10165的行數(shù)據(jù)為:\n",data1.loc[10165])輸出結(jié)果如圖3-*所示。圖3-*任務(wù)1(3)輸出結(jié)果任務(wù)1(4)具體代碼如下:print("選取'城市'為內(nèi)江,'銷售金額'大于100數(shù)據(jù)為:\n",data1.loc[(data1['城市']=='內(nèi)江')&(data1['銷售金額']>100)])輸出結(jié)果如圖3-*所示。圖3-*任務(wù)1(4)輸出結(jié)果任務(wù)2:利用read_excel導(dǎo)入supermarket.xlsx(supermarket.xlsx存放在c:\data路徑中)中的“銷售統(tǒng)計”工作表(第1張工作表),將導(dǎo)入數(shù)據(jù)的前5行命名為data2,并完成:(1)選取行索引為2到4,“客戶姓名”和“客戶ID”列的數(shù)據(jù)。(2)選取“客戶姓名”為“許安”,“客戶姓名”、“銷售金額”、“折扣金額”列的數(shù)據(jù)。任務(wù)2(1)具體代碼如下:data2=pd.read_excel('c:\data\supermarket.xlsx').head(5)print("導(dǎo)入的數(shù)據(jù)為:\n",data2)print("行索引為2到4的'客戶姓名'和'客戶ID'的數(shù)據(jù):\n",data2.loc[2:4,['客戶姓名','客戶ID']])輸出結(jié)果如圖3-*所示。圖3-*任務(wù)2(1)輸出結(jié)果任務(wù)2(2)具體代碼如下:print("'客戶姓名'為許安,'客戶姓名'、'銷售金額'、'折扣金額'的數(shù)據(jù)為:\n",data2.loc[data2['客戶姓名']=='許安',['客戶姓名','銷售金額','折扣金額']])輸出結(jié)果如圖3-*所示。圖3-*任務(wù)2(2)輸出結(jié)果鞏固訓(xùn)練利用read_excel導(dǎo)入supermarket.xlsx(supermarket.xlsx存放在c:\data路徑中)中的“銷售統(tǒng)計”工作表(第1張工作表),導(dǎo)入數(shù)據(jù)的前10行,并完成:(1)選取“城市”、“銷售金額”、“折扣金額”3列數(shù)據(jù)。(2)選取“銷售金額”大于5000的“客戶姓名”和“客戶ID”。課題3.5數(shù)據(jù)的去空與去重課型講練授課班級大數(shù)據(jù)授課時數(shù)2教學(xué)目標(biāo)1.能夠按要求刪除數(shù)據(jù)的空值。2.能夠按要求刪除數(shù)據(jù)的重復(fù)值。教學(xué)重點(diǎn)1.能夠按要求刪除數(shù)據(jù)的空值。2.能夠按要求刪除數(shù)據(jù)的重復(fù)值。教學(xué)難點(diǎn)1.能夠按要求刪除數(shù)據(jù)的空值。2.能夠按要求刪除數(shù)據(jù)的重復(fù)值。學(xué)情分析去空和去重是數(shù)據(jù)預(yù)處理中的重要的一環(huán),一般的數(shù)據(jù)往往需要進(jìn)行去空和去重之后才能分析。數(shù)據(jù)去重時,可按照橫向和縱向兩種方向進(jìn)行去重,對于按縱向刪除重復(fù)列的情況較少。在對數(shù)據(jù)進(jìn)行預(yù)處理時,去空和去重是兩個非常重要的方法。去空是指去除帶有空值的數(shù)據(jù),去重是指去除重復(fù)數(shù)據(jù)。一、數(shù)據(jù)去空數(shù)據(jù)中的某個或某些特征的值是不完整的,這些值稱為缺失值,簡單來說,缺失值就是空值。1.查看空值pandas提供了識別空值的方法isnull,這種方法在使用時返回的都是布爾值True和False。再結(jié)合sum函數(shù),可以檢測出數(shù)據(jù)中每列的空值頻數(shù),統(tǒng)計各列空值頻數(shù)的一般用法為:DataFrame.isnull().sum()示例代碼如下:importnumpyasnpimportpandasaspdarr=np.arange(1,17).reshape(4,4)data=pd.DataFrame(arr,columns=['a','b','c','d'])data.iloc[1:3,1:4]=np.nan#表示將行索引編號1到2,列索引編號1到3的數(shù)據(jù)都設(shè)為空值data.loc[[0,3],'b']=np.nan#表示將行索引編號1和3,列索引b的數(shù)據(jù)都設(shè)為空值print("初始數(shù)據(jù)為:\n",data)print("各列的空值頻數(shù)為:\n",data.isnull().sum())【結(jié)果分析】利用np.nan可以生成DataFrame的空值。輸出結(jié)果如圖3-*所示。圖3-*統(tǒng)計各列的空值頻數(shù)示例結(jié)果2.刪除空值刪除空值是刪除帶有空值的行或列,它屬于利用減少樣本量來換取信息完整度的一種方法,是一種最簡單的空值處理方法。pandas中提供了刪除空值的dropna函數(shù),該函數(shù)可以刪除帶有空值的行或列。在實(shí)際操作中,刪除帶有空值的行的情況比較多。dropna函數(shù)的一般用法為:DataFrame.dropna(axis,how,subset=[columns],inplace)其中,各個參數(shù)的作用如下:axis接收0或1。axis=0表示刪除空值所在的行,axis=1表示刪除空值所在的列。默認(rèn)為axis=0,即刪除空值所在的行。how表示刪除空值數(shù)據(jù)的方式。how='any'表示只要有空值存在就刪除。how='all'表示當(dāng)且僅當(dāng)全部為空值時就刪除。默認(rèn)為any。subset表示進(jìn)行去空操作的列或行。按行刪除時,subset表示columns列名,而按列刪除時,subset表示行索引index。inplace表示刪除結(jié)果是否替換原表,默認(rèn)為False。(1)刪除空值所在行刪除空值所在行的一般用法為:DataFrame.dropna(axis=0,how,subset,inplace)其中,axis=0為刪除空值所在的行。subset表示按行刪空時,需要考慮的列。示例代碼如下:data_drop1=data.dropna(axis=0,how='any',subset=['a','b','c'])print("刪除abc三列中任意一列中出現(xiàn)空值的行:\n",data_drop1)data_drop2=data.dropna(axis=0,how='all',subset=['a','b','c'])print("刪除abc三列中任全部都為空值的行:\n",data_drop2)輸出結(jié)果如圖3-*所示。圖3-*刪除空值所在行示例結(jié)果【結(jié)果分析】axis=0表示按行刪空,subset表示列名,進(jìn)一步分析abc三列。在how='any'的情況下,行索引為1、2、3三條數(shù)據(jù)都有任意一列出現(xiàn)空值,所以都被刪除了,只保留了索引號為0的行數(shù)據(jù)。在how='all'的情況下,只有行索引為1的一條數(shù)據(jù)三列都是空值,所以行索引為1的行數(shù)據(jù)被刪除了,保留了索引號為0、2、3的行數(shù)據(jù)。(2)刪除空所在值列刪除空值所在列的情況較少,因為通常情況下,不會因為一列中存在一個空值而把整個一列都刪除,這樣丟失的信息量就會太大。刪除空值所在列的一般用法為:DataFrame.dropna(axis=1,how,subset,inplace)其中,axis=1為刪除空值所在的列。在按列刪空時,how一般取all,默認(rèn)也是all,表示只有當(dāng)一列中所有行或指定行都為空值才刪除該列。subset表示按列刪空時,需要考慮的行,默認(rèn)是所有行,也可以指定行。在實(shí)際操作中,很少會出現(xiàn)一列都是空值的情況,因為如果一列都是空值,那么這一列也就沒有包含任何信息。示例代碼如下:data_drop3=data.dropna(axis=1,how='all',subset=range(2,len(data)))print("按列刪空,刪除行索引2之后全部都為空值的列:\n",data_drop3)【結(jié)果分析】len(data)表示數(shù)據(jù)的長度,即len(data)等于4,range(2,len(data)就是指range(2,4),因為range表示的是左閉右開的列表,即行索引2和3,所以range(2,len(data)就可以表示行索引2之后的全部行。輸出結(jié)果如圖3-*所示。圖3-*刪除空所在值列示例結(jié)果【結(jié)果分析】按列刪空時,subset表示行索引號,進(jìn)一步分析行索引號2之后的所有行。在how默認(rèn)等于'all'的情況下,b列行索引2和行索引3都是空值,所以b列被刪除了,保留了a、c、d列的數(shù)據(jù)。二、數(shù)據(jù)去重去除重復(fù)數(shù)據(jù)也是數(shù)據(jù)分析經(jīng)常面對的問題之一,常見的重復(fù)值完全相同的行數(shù)據(jù),或是某幾列相同的行數(shù)據(jù)。1.查看重復(fù)值 去除重復(fù)數(shù)據(jù)之前,首先需要了解數(shù)據(jù)中的重復(fù)情況,pandas提供了duplicates函數(shù),用來查看數(shù)據(jù)中的重復(fù)情況,duplicates函數(shù)一般用法為:DataFrame.duplicates(subset,inplace)其中,subset表示列名。默認(rèn)為None,表示全部列,即如果一行的所有列出現(xiàn)重復(fù)就返回結(jié)果。2.刪除重復(fù)值去除重復(fù)數(shù)據(jù)可以使用pandas提供的去重drop_duplicates函數(shù)。使用drop_duplicates函數(shù)對數(shù)據(jù)進(jìn)行去重,不會改變數(shù)據(jù)源的原始排列,并且具有代碼簡潔和運(yùn)行穩(wěn)定的優(yōu)點(diǎn)。drop_duplicates函數(shù)的一般用法為:DataFrame.drop_duplicates(subset,keep,inplace)其中,subset表示列名。默認(rèn)為None,表示全部列,即如果一行的所有列出現(xiàn)重復(fù)就刪除。keep表示出現(xiàn)重復(fù)時保留第一次出現(xiàn)的數(shù)據(jù)還是最后一次出現(xiàn)的數(shù)據(jù),first表示保留第一次出現(xiàn)的數(shù)據(jù),last表示保留最后一次出現(xiàn)的數(shù)據(jù)。默認(rèn)為first,即如果出現(xiàn)重復(fù),保留第一次出現(xiàn)的數(shù)據(jù)。任務(wù)實(shí)訓(xùn)任務(wù)1:利用read_excel導(dǎo)入supermarket.xlsx(supermarket.xlsx存放在c:\data路徑中)中的“銷售統(tǒng)計”工作表(第1張工作表),將導(dǎo)入數(shù)據(jù)的前5行命名為data1,并完成:(1)統(tǒng)計各列的空值頻數(shù)。(2)刪除“客戶ID”和“客戶姓名”都是空值的行。(3)刪除一列中所有的值都為空值的列。任務(wù)1(1)具體代碼如下:pd.set_option('display.max_columns',None)pd.set_option('display.width',None)pd.set_option('display.unicode.east_asian_width',True)data1=pd.read_excel('c:\data\supermarket.xlsx').head(5)print("導(dǎo)入的數(shù)據(jù)為:\n",data1)result=data1.isnull().sum()print("各列的空值頻數(shù)為:\n",result[result>0])#通過result[result>0]僅僅顯示出現(xiàn)空值的列輸出結(jié)果如圖3-*所示。圖3-*任務(wù)1(1)輸出結(jié)果任務(wù)1(2)具體代碼如下:data1_drop1=data1.dropna(axis=0,how='all',subset=['客戶ID','客戶姓名'])print("刪除“客戶ID”和“客戶姓名”都是空值的行:\n",data1_drop1)輸出結(jié)果如圖3-*所示。圖3-*任務(wù)1(2)輸出結(jié)果【結(jié)果分析】從結(jié)果中可以看到,因為行索引為3的“客戶ID”和“客戶姓名”都是空值,所以這一行被刪除了。任務(wù)1(3)具體代碼如下:data1_drop2=data1.dropna(axis=1,how='all')print("刪除一列中所有的值都為空值的列:\n",data1_drop2)輸出結(jié)果如圖3-*所示。圖3-*任務(wù)1(3)輸出結(jié)果【結(jié)果分析】從結(jié)果中可以看到,因為“折扣金額”這一列的所有值都為空值,所以這一列被刪除了。任務(wù)2:利用read_excel導(dǎo)入supermarket.xlsx(supermarket.xlsx存放在c:\data路徑中)中的“銷售統(tǒng)計”工作表(第1張工作表),將導(dǎo)入數(shù)據(jù)的前50行命名為data2,并完成:(1)根據(jù)shape屬性,查看數(shù)據(jù)data2的行數(shù)。(2)利用duplicates函數(shù),查看“訂單ID”、“產(chǎn)品ID”、“產(chǎn)品名稱”三列出現(xiàn)重復(fù)的數(shù)據(jù)的前10列。(3)利用drop_duplicates函數(shù),刪除“訂單ID”、“產(chǎn)品ID”、“產(chǎn)品名稱”三列出現(xiàn)重復(fù)的數(shù)據(jù),并保留第一次出現(xiàn)的數(shù)據(jù),結(jié)果存放在data2_drop中,查看data2_drop的前15行與前10列。(4)根據(jù)shape屬性,查看數(shù)據(jù)data2_drop的行數(shù)。任務(wù)2(1)具體代碼如下:print("data2的行數(shù)為:",data2.shape[0])輸出結(jié)果如圖3-*所示。圖3-*任務(wù)2(1)輸出結(jié)果任務(wù)2(2)具體代碼如下:data2_dup=data2[data2.duplicated(['訂單ID','產(chǎn)品ID','產(chǎn)品名稱'])]print("'訂單ID','產(chǎn)品ID','產(chǎn)品名稱'出現(xiàn)重復(fù)的數(shù)據(jù)為:\n",data2_dup.iloc[:,:10])輸出結(jié)果如圖3-*所示。圖3-*任務(wù)2(2)輸出結(jié)果【結(jié)果分析】iloc函數(shù)可以按照先行(行索引編號)后列(列索引編號)的順序選取數(shù)據(jù),在[:,:10]中,逗號前的“:”表示默認(rèn)選取所有行,逗號后的“:10”表示從默認(rèn)列索引0到9,原因是左閉右開索引區(qū)間,所以10是不能取到的,因此就是前10列。任務(wù)2(3)具體代碼如下:data2_drop=data2.drop_duplicates(subset=['訂單ID','產(chǎn)品ID','產(chǎn)品名稱'],keep='first')print("'訂單ID','產(chǎn)品ID','產(chǎn)品名稱'出現(xiàn)重復(fù)的數(shù)據(jù)刪除后的數(shù)據(jù)為:\n",data2_drop.iloc[:15,:10])輸出結(jié)果如圖3-*所示。圖3-*任務(wù)2(3)輸出結(jié)果任務(wù)2(4)具體代碼如下:print("進(jìn)行去重操作后data2的行數(shù)為:",data2_drop.shape[0])輸出結(jié)果如圖3-*所示。圖3-*任務(wù)2(4)輸出結(jié)果鞏固訓(xùn)練利用read_csvl導(dǎo)入score.csv(score.csv存放在c:\data路徑中),數(shù)據(jù)源如圖并完成:圖3-*練習(xí)源數(shù)據(jù)(部分)(1)各列的空值頻數(shù)。(2)刪除兩列“gender”和“area”中任意一個為空值的行。(3)刪除4個科目列全為空值的行。(4)刪除兩列“gender”和“area”中有重復(fù)值的行,保留最后一次出現(xiàn)的值。課題3.6數(shù)據(jù)的填充與替換課型講練授課班級大數(shù)據(jù)授課時數(shù)2教學(xué)目標(biāo)1.能夠利用指定值或統(tǒng)計指標(biāo)填充空值。2.能夠?qū)?shù)據(jù)中的指定值進(jìn)行替換。教學(xué)重點(diǎn)1.能夠利用指定值或統(tǒng)計指標(biāo)填充空值。2.能夠?qū)?shù)據(jù)中的指定值進(jìn)行替換。教學(xué)難點(diǎn)1.替換時注意字典的使用方法。學(xué)情分析在數(shù)據(jù)預(yù)處理時,常常需要將字符型數(shù)據(jù)的單位去掉變?yōu)閿?shù)值型,這就需要使用替換的方法,替換時需要有時需要用到之前學(xué)到的字典。在對數(shù)據(jù)進(jìn)行預(yù)處理時,去空和去重是兩個非常重要的方法。去空是指去除帶有空值的數(shù)據(jù),去重是指去除重復(fù)數(shù)據(jù)。一、數(shù)據(jù)去空數(shù)據(jù)中的某個或某些特征的值是不完整的,這些值稱為缺失值,簡單來說,缺失值就是空值。1.查看空值pandas提供了識別空值的方法isnull,這種方法在使用時返回的都是布爾值True和False。再結(jié)合sum函數(shù),可以檢測出數(shù)據(jù)中每列的空值頻數(shù),統(tǒng)計各列空值頻數(shù)的一般用法為:DataFrame.isnull().sum()示例代碼如下:importnumpyasnpimportpandasaspdarr=np.arange(1,17).reshape(4,4)data=pd.DataFrame(arr,columns=['a','b','c','d'])data.iloc[1:3,1:4]=np.nan#表示將行索引編號1到2,列索引編號1到3的數(shù)據(jù)都設(shè)為空值data.loc[[0,3],'b']=np.nan#表示將行索引編號1和3,列索引b的數(shù)據(jù)都設(shè)為空值print("初始數(shù)據(jù)為:\n",data)print("各列的空值頻數(shù)為:\n",data.isnull().sum())【結(jié)果分析】利用np.nan可以生成DataFrame的空值。輸出結(jié)果如圖3-*所示。圖3-*統(tǒng)計各列的空值頻數(shù)示例結(jié)果2.刪除空值刪除空值是刪除帶有空值的行或列,它屬于利用減少樣本量來換取信息完整度的一種方法,是一種最簡單的空值處理方法。pandas中提供了刪除空值的dropna函數(shù),該函數(shù)可以刪除帶有空值的行或列。在實(shí)際操作中,刪除帶有空值的行的情況比較多。dropna函數(shù)的一般用法為:DataFrame.dropna(axis,how,subset=[columns],inplace)其中,各個參數(shù)的作用如下:axis接收0或1。axis=0表示刪除空值所在的行,axis=1表示刪除空值所在的列。默認(rèn)為axis=0,即刪除空值所在的行。how表示刪除空值數(shù)據(jù)的方式。how='any'表示只要有空值存在就刪除。how='all'表示當(dāng)且僅當(dāng)全部為空值時就刪除。默認(rèn)為any。subset表示進(jìn)行去空操作的列或行。按行刪除時,subset表示columns列名,而按列刪除時,subset表示行索引index。inplace表示刪除結(jié)果是否替換原表,默認(rèn)為False。(1)刪除空值所在行刪除空值所在行的一般用法為:DataFrame.dropna(axis=0,how,subset,inplace)其中,axis=0為刪除空值所在的行。subset表示按行刪空時,需要考慮的列。示例代碼如下:data_drop1=data.dropna(axis=0,how='any',subset=['a','b','c'])print("刪除abc三列中任意一列中出現(xiàn)空值的行:\n",data_drop1)data_drop2=data.dropna(axis=0,how='all',subset=['a','b','c'])print("刪除abc三列中任全部都為空值的行:\n",data_drop2)輸出結(jié)果如圖3-*所示。圖3-*刪除空值所在行示例結(jié)果【結(jié)果分析】axis=0表示按行刪空,subset表示列名,進(jìn)一步分析abc三列。在how='any'的情況下,行索引為1、2、3三條數(shù)據(jù)都有任意一列出現(xiàn)空值,所以都被刪除了,只保留了索引號為0的行數(shù)據(jù)。在how='all'的情況下,只有行索引為1的一條數(shù)據(jù)三列都是空值,所以行索引為1的行數(shù)據(jù)被刪除了,保留了索引號為0、2、3的行數(shù)據(jù)。(2)刪除空所在值列刪除空值所在列的情況較少,因為通常情況下,不會因為一列中存在一個空值而把整個一列都刪除,這樣丟失的信息量就會太大。刪除空值所在列的一般用法為:DataFrame.dropna(axis=1,how,subset,inplace)其中,axis=1為刪除空值所在的列。在按列刪空時,how一般取all,默認(rèn)也是all,表示只有當(dāng)一列中所有行或指定行都為空值才刪除該列。subset表示按列刪空時,需要考慮的行,默認(rèn)是所有行,也可以指定行。在實(shí)際操作中,很少會出現(xiàn)一列都是空值的情況,因為如果一列都是空值,那么這一列也就沒有包含任何信息。示例代碼如下:data_drop3=data.dropna(axis=1,how='all',subset=range(2,len(data)))print("按列刪空,刪除行索引2之后全部都為空值的列:\n",data_drop3)【結(jié)果分析】len(data)表示數(shù)據(jù)的長度,即len(data)等于4,range(2,len(data)就是指range(2,4),因為range表示的是左閉右開的列表,即行索引2和3,所以range(2,len(data)就可以表示行索引2之后的全部行。輸出結(jié)果如圖3-*所示。圖3-*刪除空所在值列示例結(jié)果【結(jié)果分析】按列刪空時,subset表示行索引號,進(jìn)一步分析行索引號2之后的所有行。在how默認(rèn)等于'all'的情況下,b列行索引2和行索引3都是空值,所以b列被刪除了,保留了a、c、d列的數(shù)據(jù)。二、數(shù)據(jù)去重去除重復(fù)數(shù)據(jù)也是數(shù)據(jù)分析經(jīng)常面對的問題之一,常見的重復(fù)值完全相同的行數(shù)據(jù),或是某幾列相同的行數(shù)據(jù)。1.查看重復(fù)值 去除重復(fù)數(shù)據(jù)之前,首先需要了解數(shù)據(jù)中的重復(fù)情況,pandas提供了duplicates函數(shù),用來查看數(shù)據(jù)中的重復(fù)情況,duplicates函數(shù)一般用法為:DataFrame.duplicates(subset,inplace)其中,subset表示列名。默認(rèn)為None,表示全部列,即如果一行的所有列出現(xiàn)重復(fù)就返回結(jié)果。2.刪除重復(fù)值去除重復(fù)數(shù)據(jù)可以使用pandas提供的去重drop_duplicates函數(shù)。使用drop_duplicates函數(shù)對數(shù)據(jù)進(jìn)行去重,不會改變數(shù)據(jù)源的原始排列,并且具有代碼簡潔和運(yùn)行穩(wěn)定的優(yōu)點(diǎn)。drop_duplicates函數(shù)的一般用法為:DataFrame.drop_duplicates(subset,keep,inplace)其中,subset表示列名。默認(rèn)為None,表示全部列,即如果一行的所有列出現(xiàn)重復(fù)就刪除。keep表示出現(xiàn)重復(fù)時保留第一次出現(xiàn)的數(shù)據(jù)還是最后一次出現(xiàn)的數(shù)據(jù),first表示保留第一次出現(xiàn)的數(shù)據(jù),last表示保留最后一次出現(xiàn)的數(shù)據(jù)。默認(rèn)為first,即如果出現(xiàn)重復(fù),保留第一次出現(xiàn)的數(shù)據(jù)。任務(wù)實(shí)訓(xùn)任務(wù)1:利用read_excel導(dǎo)入supermarket.xlsx(supermarket.xlsx存放在c:\data路徑中)中的“銷售統(tǒng)計”工作表(第1張工作表),將導(dǎo)入數(shù)據(jù)的前5行命名為data1,并完成:(1)統(tǒng)計各列的空值頻數(shù)。(2)刪除“客戶ID”和“客戶姓名”都是空值的行。(3)刪除一列中所有的值都為空值的列。任務(wù)1(1)具體代碼如下:pd.set_option('display.max_columns',None)pd.set_option('display.width',None)pd.set_option('display.unicode.east_asian_width',True)data1=pd.read_excel('c:\data\supermarket.xlsx').head(5)print("導(dǎo)入的數(shù)據(jù)為:\n",data1)result=data1.isnull().sum()print("各列的空值頻數(shù)為:\n",result[result>0])#通過result[result>0]僅僅顯示出現(xiàn)空值的列輸出結(jié)果如圖3-*所示。圖3-*任務(wù)1(1)輸出結(jié)果任務(wù)1(2)具體代碼如下:data1_drop1=data1.dropna(axis=0,how='all',subset=['客戶ID','客戶姓名'])print("刪除“客戶ID”和“客戶姓名”都是空值的行:\n",data1_drop1)輸出結(jié)果如圖3-*所示。圖3-*任務(wù)1(2)輸出結(jié)果【結(jié)果分析】從結(jié)果中可以看到,因為行索引為3的“客戶ID”和“客戶姓名”都是空值,所以這一行被刪除了。任務(wù)1(3)具體代碼如下:data1_drop2=data1.dropna(axis=1,how='all')print("刪除一列中所有的值都為空值的列:\n",data1_drop2)輸出結(jié)果如圖3-*所示。圖3-*任務(wù)1(3)輸出結(jié)果【結(jié)果分析】從結(jié)果中可以看到,因為“折扣金額”這一列的所有值都為空值,所以這一列被刪除了。任務(wù)2:利用read_excel導(dǎo)入supermarket.xlsx(supermarket.xlsx存放在c:\data路徑中)中的“銷售統(tǒng)計”工作表(第1張工作表),將導(dǎo)入數(shù)據(jù)的前50行命名為data2,并完成:(1)根據(jù)shape屬性,查看數(shù)據(jù)data2的行數(shù)。(2)利用duplicates函數(shù),查看“訂單ID”、“產(chǎn)品ID”、“產(chǎn)品名稱”三列出現(xiàn)重復(fù)的數(shù)據(jù)的前10列。(3)利用drop_duplicates函數(shù),刪除“訂單ID”、“產(chǎn)品ID”、“產(chǎn)品名稱”三列出現(xiàn)重復(fù)的數(shù)據(jù),并保留第一次出現(xiàn)的數(shù)據(jù),結(jié)果存放在data2_drop中,查看data2_drop的前15行與前10列。(4)根據(jù)shape屬性,查看數(shù)據(jù)data2_drop的行數(shù)。任務(wù)2(1)具體代碼如下:print("data2的行數(shù)為:",data2.shape[0])輸出結(jié)果如圖3-*所示。圖3-*任務(wù)2(1)輸出結(jié)果任務(wù)2(2)具體代碼如下:data2_dup=data2[data2.duplicated(['訂單ID','產(chǎn)品ID','產(chǎn)品名稱'])]print("'訂單ID','產(chǎn)品ID','產(chǎn)品名稱'出現(xiàn)重復(fù)的數(shù)據(jù)為:\n",data2_dup.iloc[:,:10])輸出結(jié)果如圖3-*所示。圖3-*任務(wù)2(2)輸出結(jié)果【結(jié)果分析】iloc函數(shù)可以按照先行(行索引編號)后列(列索引編號)的順序選取數(shù)據(jù),在[:,:10]中,逗號前的“:”表示默認(rèn)選取所有行,逗號后的“:10”表示從默認(rèn)列索引0到9,原因是左閉右開索引區(qū)間,所以10是不能取到的,因此就是前10列。任務(wù)2(3)具體代碼如下:data2_drop=data2.drop_duplicates(subset=['訂單ID','產(chǎn)品ID','產(chǎn)品名稱'],keep='first')print("'訂單ID','產(chǎn)品ID','產(chǎn)品名稱'出現(xiàn)重復(fù)的數(shù)據(jù)刪除后的數(shù)據(jù)為:\n",data2_drop.iloc[:15,:10])輸出結(jié)果如圖3-*所示。圖3-*任務(wù)2(3)輸出結(jié)果任務(wù)2(4)具體代碼如下:print("進(jìn)行去重操作后data2的行數(shù)為:",data2_drop.shape[0])輸出結(jié)果如圖3-*所示。圖3-*任務(wù)2(4)輸出結(jié)果鞏固訓(xùn)練利用read_csvl導(dǎo)入score.csv(score.csv存放在c:\data路徑中),數(shù)據(jù)源如圖并完成:圖3-*練習(xí)源數(shù)據(jù)(部分)(1)各列的空值頻數(shù)。(2)刪除兩列“gender”和“area”中任意一個為空值的行。(3)刪除4個科目列全為空值的行。(4)刪除兩列“gender”和“area”中有重復(fù)值的行,保留最后一次出現(xiàn)的值。課題3.7數(shù)據(jù)的拼接和合并課型講練授課班級大數(shù)據(jù)授課時數(shù)2教學(xué)目標(biāo)1.理解縱向拼接和橫向合并的意義。2.能夠?qū)⒍鄠€數(shù)據(jù)進(jìn)行縱向拼接。3.能夠?qū)⒍鄠€數(shù)據(jù)進(jìn)行橫向合并。4.理解橫向合并中內(nèi)連接、外連接、左連接、右連接的作用。教學(xué)重點(diǎn)1.能夠?qū)⒍鄠€數(shù)據(jù)進(jìn)行縱向拼接。2.能夠?qū)⒍鄠€數(shù)據(jù)進(jìn)行橫向合并。教學(xué)難點(diǎn)1.理解橫向合并中內(nèi)連接、外連接、左連接、右連接的作用。學(xué)情分析數(shù)據(jù)的連接在數(shù)據(jù)庫SQL中已經(jīng)學(xué)過,這一點(diǎn)有助于pandas的數(shù)據(jù)合并的內(nèi)容的學(xué)習(xí)。在數(shù)據(jù)導(dǎo)入時,往往會遇到數(shù)據(jù)的合成。比如某店鋪想了解某月的銷售額,就需要將這個月第1天、第2天、…,直到最后一天的日銷售報表合成一個月銷售報表,以了解商鋪的運(yùn)營情況。數(shù)據(jù)的合成是一種將來自不同源的數(shù)據(jù)組合成一個報表的有效方法常用的方法。如果將兩個或多個列名完全相同的DataFrame數(shù)據(jù)連接起來,從方向上看是數(shù)據(jù)的縱向拼接。如果根據(jù)某一列將不同的兩個DataFrame數(shù)據(jù)合并在一起,從方向上看是數(shù)據(jù)的橫向合并。縱向拼接和橫向合并都有各自的特點(diǎn),使用時需要注意數(shù)據(jù)合成的方向。一、數(shù)據(jù)的縱向拼接數(shù)據(jù)的縱向拼接將兩個或多個DataFrame同列拼接,在拼接時,要保證不同的DataFrame列名必須全部相同,否則就會出現(xiàn)多個空值??v向拼接可以使用append函數(shù),append的一般用法為:DataFrame.append(other,ignore_index) 其中,other表示添加的數(shù)據(jù)。ignore_index表示是否忽略原來索引并重新構(gòu)建索引。append函數(shù)可以將數(shù)據(jù)向下拓展,在數(shù)據(jù)拼接時,如果僅僅將默認(rèn)的索引按照原始的行號連接起來,比如表1默認(rèn)索引是0、1、2、…,表2默認(rèn)索引是0、1、2、…,連接后的索引就是0、1、2、…、0、1、2、…,這顯然不方便數(shù)據(jù)的調(diào)用。ignore_index=True表示忽略原來索引重新構(gòu)建索引,即表2的索引會在表1的索引的基礎(chǔ)自動向下編號,使得兩個表的索引變?yōu)橐粋€完整的索引,便于數(shù)據(jù)選取。ignore_index=False表示沿用原來索引,而且這是默認(rèn)設(shè)置。示例代碼如下:importnumpyasnpimportpandasaspdarr1=np.arange(1,10).reshape(3,3)data_1=pd.DataFrame(arr1,columns=['a','b','c'])arr2=np.arange(10,16).reshape(2,3)data_2=pd.DataFrame(arr2,columns=['a','b','e'])print("初始數(shù)據(jù)為:\n",data_1)print("初始拼接數(shù)據(jù)為:\n",data_2)data_append1=data_1.append(data_2,ignore_index=False)data_append2=data_1.append(data_2,ignore_index=True)print("沿用原來索引的結(jié)果為:\n",data_append1)print("重新構(gòu)建索引的結(jié)果為:\n",data_append2)圖3-*數(shù)據(jù)的縱向拼接示例結(jié)果 【結(jié)果分析】從結(jié)果中可以看到,在數(shù)據(jù)拼接時,如果參數(shù)ignore_index等于False,data_2的索引還是原來的0和1,如果參數(shù)ignore_index等于True,data_2的索引就在data_1索引的基礎(chǔ)上自動變?yōu)樾滤饕?和4。二、數(shù)據(jù)的橫向合并 merge函數(shù)可以將兩個表格(DataFrame)進(jìn)行橫向合并,通過merge函數(shù)可以將兩個Dataframe根據(jù)一些共有的列(合并字段或主鍵)合并起來,比如編號“ID”。橫向合并時可以選擇不同的合并方式,可以選擇inner(默認(rèn))、outer、left、right這幾種模式,分別對應(yīng)是內(nèi)連接、外連接,左連接,右連接。merge函數(shù)的一般用法為:pandas.merge(left_Dataframe,right_Dataframe

溫馨提示

  • 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

提交評論