使用pandas进行数据处理之 DataFrame篇
相關(guān)學(xué)習(xí)推薦:python教程
這是pandas數(shù)據(jù)處理專題的第二篇文章,我們一起來聊聊pandas當(dāng)中最重要的數(shù)據(jù)結(jié)構(gòu)——DataFrame。
上一篇文章當(dāng)中我們介紹了Series的用法,也提到了Series相當(dāng)于一個(gè)一維的數(shù)組,只是pandas為我們封裝了許多方便好用的api。而DataFrame可以簡(jiǎn)單了理解成Series構(gòu)成的dict,這樣就將數(shù)據(jù)拼接成了二維的表格。并且為我們提供了許多表級(jí)別數(shù)據(jù)處理以及批量數(shù)據(jù)處理的接口,大大降低了數(shù)據(jù)處理的難度。
創(chuàng)建DataFrame
DataFrame是一個(gè)表格型的數(shù)據(jù)結(jié)構(gòu),它擁有兩個(gè)索引,分別是行索引以及列索引,使得我們可以很方便地獲取對(duì)應(yīng)的行以及列。這就大大降低了我們查找數(shù)據(jù)處理數(shù)據(jù)的難度。
首先,我們先從最簡(jiǎn)單的開始,如何創(chuàng)建一個(gè)DataFrame。
從字典創(chuàng)建
我們創(chuàng)建了一個(gè)dict,它的key是列名,value是一個(gè)list,當(dāng)我們將這個(gè)dict傳入DataFrame的構(gòu)造函數(shù)的時(shí)候,它將會(huì)以key作為列名,value作為對(duì)應(yīng)的值為我們創(chuàng)建一個(gè)DataFrame。
當(dāng)我們?cè)趈upyter輸出的時(shí)候,它會(huì)自動(dòng)為我們將DataFrame中的內(nèi)容以表格的形式展現(xiàn)。
從numpy數(shù)據(jù)創(chuàng)建
我們也可以從一個(gè)numpy的二維數(shù)組來創(chuàng)建一個(gè)DataFrame,如果我們只是傳入numpy的數(shù)組而不指定列名的話,那么pandas將會(huì)以數(shù)字作為索引為我們創(chuàng)建列:
我們?cè)趧?chuàng)建的時(shí)候?yàn)閏olumns這個(gè)字段傳入一個(gè)string的list即可為它指定列名:
從文件讀取
pandas另外一個(gè)非常強(qiáng)大的功能就是可以從各種格式的文件當(dāng)中讀取數(shù)據(jù)創(chuàng)建DataFrame,比如像是常用的excel、csv,甚至是數(shù)據(jù)庫(kù)也可以。
對(duì)于excel、csv、json等這種結(jié)構(gòu)化的數(shù)據(jù),pandas提供了專門的api,我們找到對(duì)應(yīng)的api進(jìn)行使用即可:
如果是一些比較特殊格式的,也沒有關(guān)系,我們使用read_table,它可以從各種文本文件中讀取數(shù)據(jù),通過傳入分隔符等參數(shù)完成創(chuàng)建。比如在上一篇驗(yàn)證PCA降維效果的文章當(dāng)中,我們從.data格式的文件當(dāng)中讀取了數(shù)據(jù)。該文件當(dāng)中列和列之間的分隔符是空格,而不是csv的逗號(hào)或者是table符。我們通過傳入sep這個(gè)參數(shù),指定分隔符就完成了數(shù)據(jù)的讀取。
這個(gè)header參數(shù)表示文件的哪些行作為數(shù)據(jù)的列名,默認(rèn)header=0,也即會(huì)將第一行作為列名。如果數(shù)據(jù)當(dāng)中不存在列名,需要指定header=None,否則會(huì)產(chǎn)生問題。我們很少會(huì)出現(xiàn)需要用到多級(jí)列名的情況,所以一般情況下最常用的就是取默認(rèn)值或者是令它等于None。
在所有這些創(chuàng)建DataFrame的方法當(dāng)中最常用的就是最后一種,從文件讀取。因?yàn)槲覀冏鰴C(jī)器學(xué)習(xí)或者是參加kaggle當(dāng)中的一些比賽的時(shí)候,往往數(shù)據(jù)都是現(xiàn)成的,以文件的形式給我們使用,需要我們自己創(chuàng)建數(shù)據(jù)的情況很少。如果是在實(shí)際的工作場(chǎng)景,雖然數(shù)據(jù)不會(huì)存在文件當(dāng)中,但是也會(huì)有一個(gè)源頭,一般是會(huì)存儲(chǔ)在一些大數(shù)據(jù)平臺(tái)當(dāng)中,模型從這些平臺(tái)當(dāng)中獲取訓(xùn)練數(shù)據(jù)。
所以總體來說,我們很少使用其他創(chuàng)建DataFrame的方法,我們有所了解,著重掌握從文件讀取的方法即可。
常用操作
下面介紹一些pandas的常用操作,這些操作是我在沒有系統(tǒng)學(xué)習(xí)pandas的使用方法之前就已經(jīng)了解的。了解的原因也很簡(jiǎn)單,因?yàn)樗鼈兲S昧?,可以說是必知必會(huì)的常識(shí)性內(nèi)容。
查看數(shù)據(jù)
我們?cè)趈upyter當(dāng)中執(zhí)行運(yùn)行DataFrame的實(shí)例會(huì)為我們打出DataFrame中所有的數(shù)據(jù),如果數(shù)據(jù)行數(shù)過多,則會(huì)以省略號(hào)的形式省略中間的部分。對(duì)于數(shù)據(jù)量很大的DataFrame,我們一般不會(huì)直接這樣輸出展示,而是會(huì)選擇展示其中的前幾條或者是后幾條數(shù)據(jù)。這里就需要用到兩個(gè)api。
展示前若干條數(shù)據(jù)的方法叫做head,它接受一個(gè)參數(shù),允許我們制定讓它從頭開始展示我們指定條數(shù)的數(shù)據(jù)。
既然有展示前面若干條自然也有展示最后若干條的api,這樣的api叫做tail。通過它我們可以查看DataFrame最后指定條數(shù)的數(shù)據(jù):
列的增刪改查
前面我們?cè)?jīng)提到過,對(duì)于DataFrame而言,它其實(shí)相當(dāng)于Series組合成的dict。既然是dict我們自然可以根據(jù)key值獲取指定的Series。
DataFrame當(dāng)中有兩種方法獲取指定的列,我們可以通過.加列名的方式或者也可以通過dict查找元素的方式來查詢:
我們也可以同時(shí)讀取多列,如果是多列的話,只支持一種方法就是通過dict查詢?cè)氐姆椒āK试S接收傳入一個(gè)list,可以查找出這個(gè)list當(dāng)中的列對(duì)應(yīng)的數(shù)據(jù)。返回的結(jié)果是這些新的列組成的新DataFrame。
我們可以用del刪除一個(gè)我們不需要的列:
我們要?jiǎng)?chuàng)建一個(gè)新的列也很簡(jiǎn)單,我們可以像是dict賦值一樣,直接為DataFrame賦值即可:
賦值的對(duì)象并不是只能是實(shí)數(shù),也可以是一個(gè)數(shù)組:
我們要修改某一列也非常簡(jiǎn)單,也是通過賦值一樣的方法覆蓋原數(shù)據(jù)即可。
轉(zhuǎn)成numpy數(shù)組
有時(shí)候我們使用pandas不方便,想要獲取它對(duì)應(yīng)的原始數(shù)據(jù),可以直接使用.values獲取DataFrame對(duì)應(yīng)的numpy數(shù)組:
由于在DataFrame當(dāng)中每一列單獨(dú)一個(gè)類型,而轉(zhuǎn)化成numpy的數(shù)組之后所有數(shù)據(jù)共享類型。那么pandas會(huì)為所有的列找一個(gè)通用類型,這就是為什么經(jīng)常會(huì)得到一個(gè)object類型的原因。所以在使用.values之前最好先查看一下類型,保證一下不會(huì)因?yàn)轭愋投鲥e(cuò)。
總結(jié)
在今天的文章當(dāng)中我們了解了DataFrame與Series的關(guān)系,也學(xué)習(xí)了一些DataFrame的基礎(chǔ)和常用的用法。雖然DataFrame可以近似看成是Series組合成的dict,但實(shí)際上它作為一個(gè)單獨(dú)的數(shù)據(jù)結(jié)構(gòu),也擁有許多自己的api,支持許多花式的操作,是我們處理數(shù)據(jù)強(qiáng)有力的工具。
有專業(yè)機(jī)構(gòu)做過統(tǒng)計(jì),對(duì)于一個(gè)算法工程師而言,大約70%的時(shí)間會(huì)被投入在數(shù)據(jù)的處理上。真正編寫模型、調(diào)參的時(shí)間可能不到20%,從這當(dāng)中我們可以看到數(shù)據(jù)處理的必要性和重要程度。在Python領(lǐng)域當(dāng)中,pandas是數(shù)據(jù)處理最好用的手術(shù)刀和工具箱,希望大家都能將它掌握。
想了解更多編程學(xué)習(xí),敬請(qǐng)關(guān)注php培訓(xùn)欄目!
總結(jié)
以上是生活随笔為你收集整理的使用pandas进行数据处理之 DataFrame篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SEO秒排策略,如何借助页面布局实现
- 下一篇: 分析SEO关键词排名差都有哪些原因呢