numpy和pandas入門
本文是《如何七周成為數據分析師》的第二十一篇教程,如果想要了解寫作初衷,可以先行閱讀七周指南。溫馨提示:如果您已經熟悉Python,大可不必再看這篇文章,或只挑選部分。
今天開始進入Python數據分析工具的教程。
數據分析絕對繞不過的三個包是numpy、scipy和pandas。numpy是Python的數值計算擴展,專門用來處理矩陣,它的運算效率比列表更高效。scipy是基於numpy的科學計算包,包括統計、線性代數等工具。pandas是基於numpy的數據分析工具,能更方便的操作大型數據集。後續的章節主要圍繞pandas講解。
numpy和pandas
numpy的數據結構是n維的數組對象,叫做ndarray。Python的list雖然也能表示,但是不高效,隨著列表數據的增加,效率會降低。
我們首先載入numpy包,因為它是第三方工具,所以每次使用前必須在代碼中載入。as是命名為別名,方便調用,np是numpy約定俗成的簡寫。
創建數組使用numpy中的array函數,新手要記住加np。我們將系統自帶的列表list轉換成了numpy中的數組。
嵌套列表會被轉換為一個多維數組,它也可以被稱為矩陣。
array數組需要注意的是,它內部的元素必須為相同類型,比如數值或者字元串。可以用dtype查詢其類型,不用加括弧。
numpy的數據類型比較豐富,包括int8,int16,int32等,不過這塊更接近計算機底層,數據分析用不太到。當我們想轉換數據格式時,可以用astype函數。
數組的計算非常方便,不要大量的循環即可批量運算。
數組索引和列表相同,通過方括弧和數字即可選擇,也可直接賦值。n
可以通過遞歸對多維數組進行篩選,如果省略了後面的索引,則返回次一級的維度,這一點和list一樣。
numpy除了上述的基礎操作之外,還有reshape、T轉置、ufunc、sort等函數,功能強大,大家可以自行查閱文檔學習,這裡我不再花費時間講解。對於數據分析師,pandas是一個更常用的包,在抽象概念上它更接近我們熟悉的excel和sql,也是最主要的分析工具。
pandas有兩個主要的數據結構,Series和DataFrame,記住大小寫區分,後續使用中不多提醒。Series類似於一維數組,和numpy的array接近,由一組數據和數據標籤組成。數據標籤有索引的作用。
載入pandas包,通過Series函數生成一個對象。我們很明顯地看到,在jupyter上它的樣式不同於array,它是豎著的。右邊是我們輸入的一組數據,左邊是數據的索引,即標籤。數據標籤是pandas區分於numpy的重要特徵。
索引不一定是從0開始的數字,它可以被定義。
索引的概念有點像SQL的主鍵,不過它的功能更強大,分析師能夠很輕鬆的通過索引選取一個數據或者一組數據。
index函數可以顯示Series的索引。Series和array一樣,通過方括弧選取數據,當要選取多個數據時,應該用列表表示多個索引,所以第三個案例嵌套了兩層方括弧。
如果數據是一個字典,也能直接通過這個字典創建Series。
此時,字典的key就是Series的索引。
Series有自動對齊索引的功能,當自定義的索引qinqin和字典隊員不上時,會自動選擇NaN,即結果為空,表示缺失。缺失值的處理會在後續講解。n
DataFrame
Series是一維的數據結構,DataFrame是一個表格型的數據結構,它含有不同的列,每列都是不同的數據類型。我們可以把DataFrame看作Series組成的字典,它既有行索引也有列索引。想像得更明白一點,它類似一張excel表格或者SQL,只是功能更強大。
構建DataFrame的方法有很多,最常用的是傳入一個字典。
DataFrame會自動補充索引,並且將字典的key作為列標籤,即column。在這裡,dict的key順序是DataFame的順序,不再是無序的。
DataFrame中可以通過info函數直接查看數據類型和統計。
列名後面是列的非空值統計量,以及數據類型,最後一行是DataFrame佔用的內存大小,對於pandas來說,千萬行幾百兆的數據也是不再話下的。
DataFrame的數據類型變更和numpy一樣,用astype就行,記住要賦值。df.age = df.age.astype,圖上只是舉例,沒有真的更改數據類型。
DataFrame的索引方式和Series一樣,它選取的是列。
返回的是一組Series,索引和原DataFrame一致。除了方括弧選取,DataFrame還有更簡單的選取方法。
行也可以通過通過位置獲取,用索引欄位ix的方式。
第二個方法不需要調用ix,直接以切片的形式獲取行,切片的用啊和數組一樣。記住,切片無法用單獨的數字選取,只能用冒號切選範圍。
列可以通過賦值的方式修改和添加,當列的名稱是全新,則會在DataFrame的最右邊自動加上新的一列。
列表和數組都可以賦值到列,長度必須匹配,列表是按照順序,數組的話,可以按index參數設置的索引對應,若為空,則填上缺失值。
DataFrame的index不可更改,這是為了數據的安全性,但我們能通過index函數獲取詳情。
DataFrame在數據選取上面非常強大。n
它支持常用的邏輯判斷,例子中,後兩種數據選取是通過布爾數組過濾出我們想要的結果。
df.sex == 男返回了一個布爾數組(記住,是兩個等號,一個等號是賦值),然後通過布爾數組找出df中符合條件為true的結果。
現在我們希望找出年齡在20以下,且性別為男的人。
這裡用到布爾類型數據的計算公式,true and true 為true,false and true 為false。pandas中的邏輯符號,並且是&,或者是|。接下來過濾出性別為女,或者年齡為18的人。n
當邏輯條件複雜時,這種寫法並不優雅,比如性別為男,且年齡在18歲,以及性別為女,且年齡在18歲以上的兩類人群,這種過濾條件就比較複雜了。pandas中可以用query函數以類SQL語言執行查詢。
query中可以直接使用列名,它的功能遠不至於此,大家有興趣可以深入學習。
DataFrame可以直接在列上進行運算,當DataFrame和DataFrame之間運算時,按索引進行加減乘除。
如果直接用加法,若列名匹配不上,會產生NaN 的缺失值,我們可以在後續後續fillna函數填充。另外一種方法是add函數,它可以直接通過參數選擇填充值。減乘除對應sub、mul、div。
DataFrame還有兩個常用函數,又特別容易搞混的是,iloc和loc。
它們都是通過索引選取行,iloc是通過所在行的數字為索引,loc是所在行的標籤為索引,簡單講,iloc是第幾行,loc是標籤。當索引沒有標籤時,loc和iloc等價。兩者支持冒號的範圍選擇。
上文提到的過的ix,則是兩者的混合,即可以行號,也可以行索引。
當行和列需要同時選擇的時候,用逗號分割,逗號前是想要選擇的行,逗號後是想要選擇的列。
完整形式是ix[ 行1:行2, 列1:列2 ],iloc和loc也支持行列同時選擇,方法一樣。新人接觸這幾塊比較容易混淆。後續聯繫即可掌握。
大家如果想加深掌握這塊,除了敲一遍代碼,可以閱讀「利用Python進行數據分析」,很經典的入門書(部分內容有點老)。也可以多拿工作中的報表做練習。
到這裡,numpy和pandas的基礎就講解的差不多了,更深入的應用,還是用實戰解決吧!下一章,將會用大家已經很熟悉的練習數據,以實際操作的方式完成一次數據分析。
————
歡迎關注我的個人公眾號:tracykanc
推薦閱讀:
※python與numpy使用的一些小tips(2)
※python二進位文件的讀取
※Python:一篇文章掌握Numpy的基本用法
※Numpy中Meshgrid函數介紹及2種應用場景