Python 資料處理庫 pandas 入門教程

發表於2018-04-17

pandas是一個Python語言的軟體包,在我們使用Python語言進行機器學習程式設計的時候,這是一個非常常用的基礎程式設計庫。本文是對它的一個入門教程。

pandas提供了快速,靈活和富有表現力的資料結構,目的是使“關係”或“標記”資料的工作既簡單又直觀。它旨在成為在Python中進行實際資料分析的高階構建塊。

入門介紹

pandas適合於許多不同型別的資料,包括:

  • 具有異構型別列的表格資料,例如SQL表格或Excel資料
  • 有序和無序(不一定是固定頻率)時間序列資料。
  • 具有行列標籤的任意矩陣資料(均勻型別或不同型別)
  • 任何其他形式的觀測/統計資料集。

由於這是一個Python語言的軟體包,因此需要你的機器上首先需要具備Python語言的環境。關於這一點,請自行在網路上搜尋獲取方法。

關於如何獲取pandas請參閱官網上的說明:pandas Installation

通常情況下,我們可以透過pip來執行安裝:

或者透過conda 來安裝pandas:

目前(2018年2月)pandas的最新版本是v0.22.0(釋出時間:2017年12月29日)。

我已經將本文的原始碼和測試資料放到Github上: pandas_tutorial ,讀者可以前往獲取。

另外,pandas常常和NumPy一起使用,本文中的原始碼中也會用到NumPy

建議讀者先對NumPy有一定的熟悉再來學習pandas,我之前也寫過一個NumPy的基礎教程,參見這裡:Python 機器學習庫 NumPy 教程

核心資料結構

pandas最核心的就是SeriesDataFrame兩個資料結構。

這兩種型別的資料結構對比如下:

名稱 維度 說明
Series 1維 帶有標籤的同構型別陣列
DataFrame 2維 表格結構,帶有標籤,大小可變,且可以包含異構的資料列

DataFrame可以看做是Series的容器,即:一個DataFrame中可以包含若干個Series。

注:在0.20.0版本之前,還有一個三維的資料結構,名稱為Panel。這也是pandas庫取名的原因:pan(el)-da(ta)-s。但這種資料結構由於很少被使用到,因此已經被廢棄了。

Series

由於Series是一維結構的資料,我們可以直接透過陣列來建立這種資料,像這樣:

這段程式碼輸出如下:

這段輸出說明如下:

  • 輸出的最後一行是Series中資料的型別,這裡的資料都是int64型別的。
  • 資料在第二列輸出,第一列是資料的索引,在pandas中稱之為Index

我們可以分別列印出Series中的資料和索引:

這兩行程式碼輸出如下:

如果不指定(像上面這樣),索引是[1, N-1]的形式。不過我們也可以在建立Series的時候指定索引。索引未必一定需要是整數,可以是任何型別的資料,例如字串。例如我們以七個字母來對映七個音符。索引的目的是可以透過它來獲取對應的資料,例如下面這樣:

這段程式碼輸出如下:

DataFrame

下面我們來看一下DataFrame的建立。我們可以透過NumPy的介面來建立一個4×4的矩陣,以此來建立一個DataFrame,像這樣:

這段程式碼輸出如下:

從這個輸出我們可以看到,預設的索引和列名都是[0, N-1]的形式。

我們可以在建立DataFrame的時候指定列名和索引,像這樣:

這段程式碼輸出如下:

我們也可以直接指定列資料來建立DataFrame:

這段程式碼輸出如下:

請注意:

  • DataFrame的不同列可以是不同的資料型別
  • 如果以Series陣列來建立DataFrame,每個Series將成為一行,而不是一列

例如:

df4的輸出如下:

我們可以透過下面的形式給DataFrame新增或者刪除列資料:

這段程式碼輸出如下:

Index物件與資料訪問

pandas的Index物件包含了描述軸的後設資料資訊。當建立Series或者DataFrame的時候,標籤的陣列或者序列會被轉換成Index。可以透過下面的方式獲取到DataFrame的列和行的Index物件:

這兩行程式碼輸出如下:

請注意:

  • Index並非集合,因此其中可以包含重複的資料
  • Index物件的值是不可以改變,因此可以透過它安全的訪問資料

DataFrame提供了下面兩個運算子來訪問其中的資料:

  • loc:透過行和列的索引來訪問資料
  • iloc:透過行和列的下標來訪問資料

例如這樣:

第一行程式碼訪問了行索引為0和1,列索引為“note”的元素。第二行程式碼訪問了行下標為0和1(對於df3來說,行索引和行下標剛好是一樣的,所以這裡都是0和1,但它們卻是不同的含義),列下標為0的元素。

這兩行程式碼輸出如下:

檔案操作

pandas庫提供了一系列的read_函式來讀取各種格式的檔案,它們如下所示:

  • read_csv
  • read_table
  • read_fwf
  • read_clipboard
  • read_excel
  • read_hdf
  • read_html
  • read_json
  • read_msgpack
  • read_pickle
  • read_sas
  • read_sql
  • read_stata
  • read_feather

讀取Excel檔案

注:要讀取Excel檔案,還需要安裝另外一個庫:xlrd

透過pip可以這樣完成安裝:

安裝完之後可以透過pip檢視這個庫的資訊:

接下來我們看一個讀取Excel的簡單的例子:

這個Excel的內容如下:

注:本文的程式碼和資料檔案可以透過文章開頭提到的Github倉庫獲取。

讀取CSV檔案

下面,我們再來看讀取CSV檔案的例子。

第一個CSV檔案內容如下:

讀取的方式也很簡單:

我們再來看第2個例子,這個檔案的內容如下:

嚴格的來說,這並不是一個CSV檔案了,因為它的資料並不是透過逗號分隔的。在這種情況下,我們可以透過指定分隔符的方式來讀取這個檔案,像這樣:

實際上,read_csv支援非常多的引數用來調整讀取的引數,如下表所示:

引數 說明
path 檔案路徑
sep或者delimiter 欄位分隔符
header 列名的行數,預設是0(第一行)
index_col 列號或名稱用作結果中的行索引
names 結果的列名稱列表
skiprows 從起始位置跳過的行數
na_values 代替NA的值序列
comment 以行結尾分隔註釋的字元
parse_dates 嘗試將資料解析為datetime。預設為False
keep_date_col 如果將列連線到解析日期,保留連線的列。預設為False
converters 列的轉換器
dayfirst 當解析可以造成歧義的日期時,以內部形式儲存。預設為False
data_parser 用來解析日期的函式
nrows 從檔案開始讀取的行數
iterator 返回一個TextParser物件,用於讀取部分內容
chunksize 指定讀取塊的大小
skip_footer 檔案末尾需要忽略的行數
verbose 輸出各種解析輸出的資訊
encoding 檔案編碼
squeeze 如果解析的資料只包含一列,則返回一個Series
thousands 千數量的分隔符

詳細的read_csv函式說明請參見這裡:pandas.read_csv

處理無效值

現實世界並非完美,我們讀取到的資料常常會帶有一些無效值。如果沒有處理好這些無效值,將對程式造成很大的干擾。

對待無效值,主要有兩種處理方法:直接忽略這些無效值;或者將無效值替換成有效值。

下面我先建立一個包含無效值的資料結構。然後透過pandas.isna函式來確認哪些值是無效的:

這段程式碼輸出如下:

忽略無效值

我們可以透過pandas.DataFrame.dropna函式拋棄無效值:

注:dropna預設不會改變原先的資料結構,而是返回了一個新的資料結構。如果想要直接更改資料本身,可以在呼叫這個函式的時候傳遞引數 inplace = True

對於原先的結構,當無效值全部被拋棄之後,將不再是一個有效的DataFrame,因此這行程式碼輸出如下:

我們也可以選擇拋棄整列都是無效值的那一列:

注:axis=1表示列的軸。how可以取值’any’或者’all’,預設是前者。

這行程式碼輸出如下:

替換無效值

我們也可以透過fillna函式將無效值替換成為有效值。像這樣:

這段程式碼輸出如下:

將無效值全部替換成同樣的資料可能意義不大,因此我們可以指定不同的資料來進行填充。為了便於操作,在填充之前,我們可以先透過rename方法修改行和列的名稱:

這段程式碼輸出如下:

處理字串

資料中常常牽涉到字串的處理,接下來我們就看看pandas對於字串操作。

Seriesstr欄位包含了一系列的函式用來處理字串。並且,這些函式會自動處理無效值。

下面是一些例項,在第一組資料中,我們故意設定了一些包含空格字串:

在這個例項中我們看到了對於字串strip的處理以及判斷字串本身是否是數字,這段程式碼輸出如下:

下面是另外一些示例,展示了對於字串大寫,小寫以及字串長度的處理:

該段程式碼輸出如下:

結束語

本文是pandas的入門教程,因此我們只介紹了最基本的操作。對於

  • MultiIndex/Advanced Indexing
  • Merge, join, concatenate
  • Computational tools

之類的高階功能,以後有機會我們再來一起學習。

讀者也可以根據下面的連結獲取更多的知識。

參考資料與推薦讀物

相關文章