pandas | 使用pandas進行資料處理——Series篇
上週我們關於Python中科學計算庫Numpy的介紹就結束了,今天我們開始介紹一個新的常用的計算工具庫,它就是大名鼎鼎的Pandas。
Pandas的全稱是Python Data Analysis Library,是一種基於Numpy的科學計算工具。它最大的特點就是可以像是操作資料庫當中的表一樣操作結構化的資料,所以它支援許多複雜和高階的操作,可以認為是Numpy的加強版。它可以很方便地從一個csv或者是excel表格當中構建出完整的資料,並支援許多表級別的批量資料計算介面。
安裝使用
和幾乎所有的Python包一樣,pandas也可以通過pip進行安裝。如果你裝過Anaconda套件的話,那麼像是numpy、pandas等庫已經自動安裝好了,如果沒有安裝過也沒有關係,我們使用一行命令即可完成安裝。
pip install pandas
和Numpy一樣,我們在使用pandas的時候通常也會給它起一個別名,pandas的別名是pd。所以使用pandas的慣例都是:
import pandas as pd
如果你執行這一行沒有報錯的話,那麼說明你的pandas已經安裝好了。一般和pandas經常一起使用的還有另外兩個包,其中一個也是科學計算包叫做Scipy,另外一個是對資料進行視覺化作圖的工具包,叫做Matplotlib。我們也可以使用pip將這兩個包一起安裝了,在之後的文章當中,用到這兩個包的時候,也會簡單介紹一下它們的用法。
pip install scipy matplotlib
Series 索引
在pandas當中我們最常用的資料結構有兩個,一個是Series另外一個是DataFrame。其中series是一維資料結構,可以簡單理解成一維陣列或者是一維向量。而DataFrame自然就是二維資料結構了,可以理解成表或者是二維陣列。
我們先來看看Series,Series當中儲存的資料主要有兩個,一個是一組資料構成的陣列,另外一個是這組資料的索引或者是標籤。我們簡單建立一個Series打印出來看一下就明白了。
這裡我們隨意建立了一個包含四個元素的Series,然後將它列印了出來。可以看到列印的資料一共有兩列,第二列是我們剛才建立的時候輸入的資料,第一列就是它的索引。由於我們建立的時候沒有特意指定索引,所以pandas會自動為我們建立行號索引,我們可以通過Series型別當中的values和index屬性檢視到Series當中儲存的資料和索引:
這裡輸出的values是一個Numpy的陣列,這並不奇怪,因為我們前面說了,pandas是一個基於Numpy開發的科學計算庫,Numpy是它的底層。從打印出來的index的資訊當中,我們可以看到這是一個Range型別的索引,它的範圍以及步長。
索引是Series構建函式當中的一個預設引數,如果我們不填,它預設會為我們生成一個Range索引,其實也就是資料的行號。我們也可以自己指定資料的索引,比如我們在剛才的程式碼當中加入index這個引數,我們就可以自己指定索引了。
當我們指定了字元型別的索引之後,index返回的結果就不再是RangeIndex而是Index了。說明pandas內部對數值型索引和字元型索引是做了區分的。
有了索引,自然是用來查詢元素用的。我們可以直接將索引當做是陣列的下標使用,兩者的效果是一樣的。不僅如此,索引陣列也是可以接受的,我們可以直接查詢若干個索引的值。
另外在建立Series的時候,重複的索引也是允許的。同樣當我們使用索引查詢的時候也會得到多個結果。
不僅如此,像是Numpy那樣的bool型索引也依然是支援的:
Series計算
Series支援許多型別的計算,我們可以直接使用加減乘除操作對整個Series進行運算:
也可以使用Numpy當中的運算函式來進行一些複雜的數學運算,但是這樣計算得到的結果會是一個Numpy的array。
因為Series當中有索引,所以我們也可以使用dict的方式判斷索引是否在Series當中:
Series有索引也有值,其實和dict的儲存結構是一樣的,所以Seires也支援通過一個dict來初始化:
通過這種方式創建出來的順序就是dict當中key儲存的順序,我們可以在建立的時候指定index,這樣就可以控制它的順序了。
我們在指定index的時候額外傳入了一個沒有在dict當中出現過的key,由於在dict當中找不到對應的值,Series會將它記成NAN(Not a number)。可以理解成是非法值或者是空值,在我們處理特徵或者是訓練資料的時候,經常會遇到存在一些條目的資料的某個特徵空缺的情況,我們可以通過pandas當中isnull和notnull函式檢查空缺的情況。
當然Series當中也有isnull的函式,我們也可以呼叫。
最後,Series當中的index也是可以修改的, 我們可以直接給它賦上新值:
總結
從核心本質上來說,pandas當中的Series就是在Numpy一維陣列上做的一層封裝,加上了索引等一些相關的功能。所以我們可以想見DataFrame其實就是一個Series的陣列的封裝,加上了更多資料處理相關的功能。我們把核心結構把握住了,再來理解整個pandas的功能要比我們一個一個死記這些api有用得多。
pandas是Python資料處理的一大利器,作為一個合格的演算法工程師幾乎是必會的內容,也是我們使用Python進行機器學習以及深度學習的基礎。根據調查資料顯示,演算法工程師日常的工作有70%的份額投入在了資料處理當中,真正用來實現模型、訓練模型的只有30%不到。因此可見資料處理的重要性,想要在行業當中有所發展,絕不僅僅是學會模型就足夠的。
文章就到這裡,如果喜歡本文,可以的話,請點個關注,給我一點鼓勵,也方便獲取更多文章。
本文使用 mdnice 排版