相關(guān)學(xué)習(xí)推薦:python教程
十余年的應(yīng)城網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都營銷網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整應(yīng)城建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)公司從事“應(yīng)城網(wǎng)站設(shè)計”,“應(yīng)城網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
這是pandas數(shù)據(jù)處理專題的第二篇文章,我們一起來聊聊pandas當(dāng)中最重要的數(shù)據(jù)結(jié)構(gòu)——DataFrame。
上一篇文章當(dāng)中我們介紹了Series的用法,也提到了Series相當(dāng)于一個一維的數(shù)組,只是pandas為我們封裝了許多方便好用的api。而DataFrame可以簡單了理解成Series構(gòu)成的dict,這樣就將數(shù)據(jù)拼接成了二維的表格。并且為我們提供了許多表級別數(shù)據(jù)處理以及批量數(shù)據(jù)處理的接口,大大降低了數(shù)據(jù)處理的難度。
創(chuàng)建DataFrameDataFrame是一個表格型的數(shù)據(jù)結(jié)構(gòu),它擁有兩個索引,分別是行索引以及列索引,使得我們可以很方便地獲取對應(yīng)的行以及列。這就大大降低了我們查找數(shù)據(jù)處理數(shù)據(jù)的難度。
首先,我們先從最簡單的開始,如何創(chuàng)建一個DataFrame。
從字典創(chuàng)建我們創(chuàng)建了一個dict,它的key是列名,value是一個list,當(dāng)我們將這個dict傳入DataFrame的構(gòu)造函數(shù)的時候,它將會以key作為列名,value作為對應(yīng)的值為我們創(chuàng)建一個DataFrame。
當(dāng)我們在jupyter輸出的時候,它會自動為我們將DataFrame中的內(nèi)容以表格的形式展現(xiàn)。
從numpy數(shù)據(jù)創(chuàng)建我們也可以從一個numpy的二維數(shù)組來創(chuàng)建一個DataFrame,如果我們只是傳入numpy的數(shù)組而不指定列名的話,那么pandas將會以數(shù)字作為索引為我們創(chuàng)建列:
我們在創(chuàng)建的時候為columns這個字段傳入一個string的list即可為它指定列名:
從文件讀取pandas另外一個非常強大的功能就是可以從各種格式的文件當(dāng)中讀取數(shù)據(jù)創(chuàng)建DataFrame,比如像是常用的excel、csv,甚至是數(shù)據(jù)庫也可以。
對于excel、csv、json等這種結(jié)構(gòu)化的數(shù)據(jù),pandas提供了專門的api,我們找到對應(yīng)的api進行使用即可:
如果是一些比較特殊格式的,也沒有關(guān)系,我們使用read_table,它可以從各種文本文件中讀取數(shù)據(jù),通過傳入分隔符等參數(shù)完成創(chuàng)建。比如在上一篇驗證PCA降維效果的文章當(dāng)中,我們從.data格式的文件當(dāng)中讀取了數(shù)據(jù)。該文件當(dāng)中列和列之間的分隔符是空格,而不是csv的逗號或者是table符。我們通過傳入sep這個參數(shù),指定分隔符就完成了數(shù)據(jù)的讀取。
這個header參數(shù)表示文件的哪些行作為數(shù)據(jù)的列名,默認header=0,也即會將第一行作為列名。如果數(shù)據(jù)當(dāng)中不存在列名,需要指定header=None,否則會產(chǎn)生問題。我們很少會出現(xiàn)需要用到多級列名的情況,所以一般情況下最常用的就是取默認值或者是令它等于None。
在所有這些創(chuàng)建DataFrame的方法當(dāng)中最常用的就是最后一種,從文件讀取。因為我們做機器學(xué)習(xí)或者是參加kaggle當(dāng)中的一些比賽的時候,往往數(shù)據(jù)都是現(xiàn)成的,以文件的形式給我們使用,需要我們自己創(chuàng)建數(shù)據(jù)的情況很少。如果是在實際的工作場景,雖然數(shù)據(jù)不會存在文件當(dāng)中,但是也會有一個源頭,一般是會存儲在一些大數(shù)據(jù)平臺當(dāng)中,模型從這些平臺當(dāng)中獲取訓(xùn)練數(shù)據(jù)。
所以總體來說,我們很少使用其他創(chuàng)建DataFrame的方法,我們有所了解,著重掌握從文件讀取的方法即可。
常用操作下面介紹一些pandas的常用操作,這些操作是我在沒有系統(tǒng)學(xué)習(xí)pandas的使用方法之前就已經(jīng)了解的。了解的原因也很簡單,因為它們太常用了,可以說是必知必會的常識性內(nèi)容。
查看數(shù)據(jù)我們在jupyter當(dāng)中執(zhí)行運行DataFrame的實例會為我們打出DataFrame中所有的數(shù)據(jù),如果數(shù)據(jù)行數(shù)過多,則會以省略號的形式省略中間的部分。對于數(shù)據(jù)量很大的DataFrame,我們一般不會直接這樣輸出展示,而是會選擇展示其中的前幾條或者是后幾條數(shù)據(jù)。這里就需要用到兩個api。
展示前若干條數(shù)據(jù)的方法叫做head,它接受一個參數(shù),允許我們制定讓它從頭開始展示我們指定條數(shù)的數(shù)據(jù)。
既然有展示前面若干條自然也有展示最后若干條的api,這樣的api叫做tail。通過它我們可以查看DataFrame最后指定條數(shù)的數(shù)據(jù):
列的增刪改查前面我們曾經(jīng)提到過,對于DataFrame而言,它其實相當(dāng)于Series組合成的dict。既然是dict我們自然可以根據(jù)key值獲取指定的Series。
DataFrame當(dāng)中有兩種方法獲取指定的列,我們可以通過.加列名的方式或者也可以通過dict查找元素的方式來查詢:
我們也可以同時讀取多列,如果是多列的話,只支持一種方法就是通過dict查詢元素的方法。它允許接收傳入一個list,可以查找出這個list當(dāng)中的列對應(yīng)的數(shù)據(jù)。返回的結(jié)果是這些新的列組成的新DataFrame。
我們可以用del刪除一個我們不需要的列:
我們要創(chuàng)建一個新的列也很簡單,我們可以像是dict賦值一樣,直接為DataFrame賦值即可:
賦值的對象并不是只能是實數(shù),也可以是一個數(shù)組:
我們要修改某一列也非常簡單,也是通過賦值一樣的方法覆蓋原數(shù)據(jù)即可。
轉(zhuǎn)成numpy數(shù)組有時候我們使用pandas不方便,想要獲取它對應(yīng)的原始數(shù)據(jù),可以直接使用.values獲取DataFrame對應(yīng)的numpy數(shù)組:
由于在DataFrame當(dāng)中每一列單獨一個類型,而轉(zhuǎn)化成numpy的數(shù)組之后所有數(shù)據(jù)共享類型。那么pandas會為所有的列找一個通用類型,這就是為什么經(jīng)常會得到一個object類型的原因。所以在使用.values之前最好先查看一下類型,保證一下不會因為類型而出錯。
總結(jié)在今天的文章當(dāng)中我們了解了DataFrame與Series的關(guān)系,也學(xué)習(xí)了一些DataFrame的基礎(chǔ)和常用的用法。雖然DataFrame可以近似看成是Series組合成的dict,但實際上它作為一個單獨的數(shù)據(jù)結(jié)構(gòu),也擁有許多自己的api,支持許多花式的操作,是我們處理數(shù)據(jù)強有力的工具。
有專業(yè)機構(gòu)做過統(tǒng)計,對于一個算法工程師而言,大約70%的時間會被投入在數(shù)據(jù)的處理上。真正編寫模型、調(diào)參的時間可能不到20%,從這當(dāng)中我們可以看到數(shù)據(jù)處理的必要性和重要程度。在Python領(lǐng)域當(dāng)中,pandas是數(shù)據(jù)處理最好用的手術(shù)刀和工具箱,希望大家都能將它掌握。
想了解更多編程學(xué)習(xí),敬請關(guān)注php培訓(xùn)欄目!