pandas | 使用pandas進行數據處理——DataFrame篇

本文始發於個人公眾號:TechFlow,原創不易,求個關注

今天是pandas數據處理專題的第二篇文章,我們一起來聊聊pandas當中最重要的數據結構——DataFrame。

上一篇文章當中我們介紹了Series的用法,也提到了Series相當於一個一維的數組,只是pandas為我們封裝了許多方便好用的api。而DataFrame可以簡單了理解成Series構成的dict,這樣就將數據拼接成了二維的表格。並且為我們提供了許多表級別數據處理以及批量數據處理的介面,大大降低了數據處理的難度。

創建DataFrame

DataFrame是一個表格型的數據結構,它擁有兩個索引,分別是行索引以及列索引,使得我們可以很方便地獲取對應的行以及列。這就大大降低了我們查找數據處理數據的難度。

首先,我們先從最簡單的開始,如何創建一個DataFrame。

從字典創建

我們創建了一個dict,它的key是列名,value是一個list,當我們將這個dict傳入DataFrame的構造函數的時候,它將會以key作為列名,value作為對應的值為我們創建一個DataFrame。

當我們在jupyter輸出的時候,它會自動為我們將DataFrame中的內容以表格的形式展現。

從numpy數據創建

我們也可以從一個numpy的二維數組來創建一個DataFrame,如果我們只是傳入numpy的數組而不指定列名的話,那麼pandas將會以數字作為索引為我們創建列

我們在創建的時候為columns這個欄位傳入一個string的list即可為它指定列名:

從文件讀取

pandas另外一個非常強大的功能就是可以從各種格式的文件當中讀取數據創建DataFrame,比如像是常用的excel、csv,甚至是資料庫也可以。

對於excel、csv、json等這種結構化的數據,pandas提供了專門的api,我們找到對應的api進行使用即可:

如果是一些比較特殊格式的,也沒有關係,我們使用read_table,它可以從各種文本文件中讀取數據,通過傳入分隔符等參數完成創建。比如在上一篇驗證PCA降維效果的文章當中,我們從.data格式的文件當中讀取了數據。該文件當中列和列之間的分隔符是空格,而不是csv的逗號或者是table符。我們通過傳入sep這個參數,指定分隔符就完成了數據的讀取。

這個header參數表示文件的哪些行作為數據的列名,默認header=0,也即會將第一行作為列名。如果數據當中不存在列名,需要指定header=None,否則會產生問題。我們很少會出現需要用到多級列名的情況,所以一般情況下最常用的就是取默認值或者是令它等於None。

在所有這些創建DataFrame的方法當中最常用的就是最後一種,從文件讀取。因為我們做機器學習或者是參加kaggle當中的一些比賽的時候,往往數據都是現成的,以文件的形式給我們使用,需要我們自己創建數據的情況很少。如果是在實際的工作場景,雖然數據不會存在文件當中,但是也會有一個源頭,一般是會存儲在一些大數據平台當中,模型從這些平台當中獲取訓練數據。

所以總體來說,我們很少使用其他創建DataFrame的方法,我們有所了解,著重掌握從文件讀取的方法即可。

常用操作

下面介紹一些pandas的常用操作,這些操作是我在沒有系統學習pandas的使用方法之前就已經了解的。了解的原因也很簡單,因為它們太常用了,可以說是必知必會的常識性內容

查看數據

我們在jupyter當中執行運行DataFrame的實例會為我們打出DataFrame中所有的數據,如果數據行數過多,則會以省略號的形式省略中間的部分。對於數據量很大的DataFrame,我們一般不會直接這樣輸出展示,而是會選擇展示其中的前幾條或者是後幾條數據。這裡就需要用到兩個api。

展示前若干條數據的方法叫做head,它接受一個參數,允許我們制定讓它從頭開始展示我們指定條數的數據。

既然有展示前面若干條自然也有展示最後若干條的api,這樣的api叫做tail。通過它我們可以查看DataFrame最後指定條數的數據:

列的增刪改查

前面我們曾經提到過,對於DataFrame而言,它其實相當於Series組合成的dict。既然是dict我們自然可以根據key值獲取指定的Series。

DataFrame當中有兩種方法獲取指定的列,我們可以通過.加列名的方式或者也可以通過dict查找元素的方式來查詢:

我們也可以同時讀取多列,如果是多列的話,只支援一種方法就是通過dict查詢元素的方法。它允許接收傳入一個list,可以查找出這個list當中的列對應的數據。返回的結果是這些新的列組成的新DataFrame。

我們可以用del刪除一個我們不需要的列

我們要創建一個新的列也很簡單,我們可以像是dict賦值一樣,直接為DataFrame賦值即可:

賦值的對象並不是只能是實數,也可以是一個數組

我們要修改某一列也非常簡單,也是通過賦值一樣的方法覆蓋原數據即可。

轉成numpy數組

有時候我們使用pandas不方便,想要獲取它對應的原始數據,可以直接使用.values獲取DataFrame對應的numpy數組:

由於在DataFrame當中每一列單獨一個類型,而轉化成numpy的數組之後所有數據共享類型。那麼pandas會為所有的列找一個通用類型,這就是為什麼經常會得到一個object類型的原因。所以在使用.values之前最好先查看一下類型,保證一下不會因為類型而出錯。

總結

在今天的文章當中我們了解了DataFrame與Series的關係,也學習了一些DataFrame的基礎和常用的用法。雖然DataFrame可以近似看成是Series組合成的dict,但實際上它作為一個單獨的數據結構,也擁有許多自己的api,支援許多花式的操作,是我們處理數據強有力的工具。

有專業機構做過統計,對於一個演算法工程師而言,大約70%的時間會被投入在數據的處理上。真正編寫模型、調參的時間可能不到20%,從這當中我們可以看到數據處理的必要性和重要程度。在Python領域當中,pandas是數據處理最好用的手術刀和工具箱,希望大家都能將它掌握。

如果喜歡本文,可以的話,來一波三連,給我一點支援吧(關注、在看、點贊)。

本文使用 mdnice 排版