通過 SQL 查詢學習 Pandas 數據處理
作者:張吉
來源:http://shzhangji.com/cnblogs/2017/07/23/learn-pandas-from-a-sql-perspective/
Pandas 是一款廣泛使用的數據處理工具。結合 NumPy 和 Matplotlib 類庫,我們可以在內存中進行高性能的數據清洗、轉換、分析及可視化工作。雖然 Python 本身是一門非常容易學習的語言,但要熟練掌握 Pandas 豐富的 API 介面及正確的使用方式,還是需要投入一定時間的。
對於數據開發工程師或分析師而言,SQL 語言是標準的數據查詢工具。本文提供了一系列的示例,如何將常見的 SQL 查詢語句使用 Pandas 來實現。
Pandas 的安裝和基本概念並不在本文講述範圍內,請讀者到官網上閱讀相關文檔,或者閱讀《利用 Python 進行數據分析》一書。我推薦大家使用 Anaconda Python 套件,其中集成了 Spyder 集成開發環境。在運行下文的代碼之前,請先引入 Pandas 和 NumPy 包:
- 讀取數據
首先,我們需要將數據載入到工作區(內存)。Pandas 原生支持非常多的數據格式,CSV 是較常見的一種。我們以航班延誤時間數據集為例(下載地址):
我們可以使用 函數載入它:
這條命令會將 文件讀入內存,使用首行作為列名,並自動檢測每一列的數據類型。其中,由於 一列的日期格式是 ,自動轉換成數字後會失去月份的前異零(02 月的 0),因此我們顯式指定了該列的 ,告知 Pandas 保留原值。
用於查看數據集的前 N 行,功能類似於 。如果要實現 ,可以使用 。此外,IPython 終端默認只顯示 60 行數據,我們可以通過以下方法修改設置:
另外一種常見的數據源是關係型資料庫,Pandas 也提供了內置支持:
如果要將 DataFrame 保存到文件或資料庫中去,可以分別使用 和 函數。
- 選擇列
語句在 SQL 中用於選擇需要的列,並對數據做清洗和轉換。
SQL 提供了諸多函數,大部分都可以用 Pandas 來實現,而且我們也很容易用 Python 編寫自定義函數。下面我將列舉一些常用的函數。
字元串函數
Pandas 的字元串函數可以通過 DateFrame 和 Series 的 屬性來調用,如 。
Pandas 有一個名為廣播的特性(broadcast),簡單來說就是能夠將低維數據(包括單個標量)和高維數據進行結合和處理。例如:
Pandas 還內置了很多字元串函數,它們的用法和 SQL 有一定區別,但功能更強。完整列表可以參考文檔 Working with Text Data。
日期函數
用於將各種日期字元串轉換成標準的 類型。日期類型的 Series 都會有一個 屬性,從中可以獲取到有關日期時間的信息,具體請參考文檔 Time Series / Date functionality。
- 選擇行
在 Pandas 中使用邏輯表達式後,會返回一個布爾型的 Series,通過它可以對數據集進行過濾:
我們可以用位運算符來組合多個查詢條件:
對於 和 ,也提供了相應的內置函數:
此外,Pandas 還提供了 方法,可以使用字元串表達式來編寫過濾條件:
其實,Pandas 提供了功能強大的數據選取工具,很多是無法用 SQL 表達出來的,建議詳細閱讀 Indexing and Selecting Data 文檔,其中包含了豐富的示例。
- 匯總
聚合運算包含了兩個部分,一是分組欄位,二是聚合函數。我們可以傳遞多個分組欄位給 ,也能夠指定多個聚合函數:
我們還可以將函數的運行結果作為分組條件。更多示例請見 Group By: split-apply-combine。
- 排序
Pandas 中有兩類排序,按索引和按數值。如果不了解 Pandas 的索引,還請自行查閱相關教程。
- 關聯查詢
如果聯合查詢的鍵是同名的,可以直接使用 。默認的關聯方式是 ( ),其它還有左外連接( )、右外連接( )、以及 ( )。
可用於實現 查詢。 更多關聯查詢的示例請參考 Merge, join, and concatenate。
最後,我們經常會需要在分組中按某種規則排序,並獲得前幾位的記錄。MySQL 中需要通過變數來實現,Pandas 中則可以使用 函數:
參考資料
題圖:pexels,CC0 授權。
※Python 官方推薦的一款打包工具
※程序員為什麼要堅持不信任原則?
※數據科學家如何使用Python和R組合完成任務
※Python 面向文檔編程的正確姿勢
TAG:編程派 |