Python資料分析(四)Pandas

數據分析那些事
17 min readJun 19, 2019

--

此文是《10周入門資料分析》系列的第16篇

想瞭解學習路線,可以先閱讀 學習計畫 | 10周入門資料分析

from 數據君

上篇介紹了 NumPy,本篇介紹 pandas。

目錄

pandas入門

pandas的資料結構介紹

基本功能

匯總和計算描述統計

處理缺失資料

層次化索引

pandas入門

Pandas 是基於Numpy構建的,讓以NumPy為中心的應用變的更加簡單。

pandas的資料結構介紹

1、Series

由一組資料(各種 NumPy 資料類型)和一組索引組成:

Values 和 index 屬性:

給所創建的Series帶有一個可以對各個數據點進行標記的索引:

與普通NumPy陣列相比,可以透過索引的方式選取Series中的單個或一組值:

可將Series看成是一個定長的有序字典,它是索引值到資料值的一個映射(它可以用在許多原本需要字典參數的函數中)。

如果資料被存放在一個 python 字典中,可以直接透過這個字典來創建Series:

如果只傳入一個字典,則結果Series中的索引就是原字典的鍵(有序排列),上面的states。

Series最重要的一個功能是在算數運算中自動對齊不同索引的資料:

Series物件本身及其索引都有一個name屬性:

Series的索引可以透過賦值的方式就地修改:

2、DataFrame

是一個表格型的資料結構。既有行索引也列索引。DataFrame中面向行和面向列的操作基本是平衡的。DataFrame中的資料是以一個或多個二維塊存放的。用層次化索引,將其表示為更高維度的資料。

構建 DataFrame:直接傳入一個由等長清單或 NumPy 陣列組成的字典。

會自動加上索引,但指定列序列,則按指定順序進行排列:

和Series一樣,如果傳入的列在資料中找不到,就會產生NA值:

透過賦值的方式進行修改:

透過類似字典標記的方式或屬性的方式,可以將DataFrame的列獲取為一個Series:

欄也可以透過位置或名稱的方式進行獲取,比如用索引欄位ix。

將清單或陣列賦值給某個列時,其長度必須跟DataFrame的長度相匹配。如果賦值的是一個Series,就會精確匹配DataFrame的索引,所有的空位都將被填上缺失值:

給不存在的列賦值會創建出一個新列,關鍵字del用於刪除列:

透過索引方式返回的列是相應資料的視圖,並不是副本,對返回的Series做的任何修改都會反映到源DataFrame上,透過series的copy方法即可顯式地複製列。

另一種常見的資料形式是嵌套字典,如果將它傳給DataFrame,解釋為 — — 外層字典的鍵作為列,內層鍵作為行索引。

對結果進行轉置:

指定索引按序列:

由Series組成的字典差不多也是一樣的用法:

設定了DataFrame的index和columns的 name 屬性,這些資訊也會被顯示,values 屬性以二維ndarray的形式返回DataFrame中的資料:

如果DataFrame各列的資料類型不同,值陣列的資料類型就會選用能相容所有列的資料類型(如 dtype = object)。

3、索引物件

pandas的索引物件,管理軸標籤和其他中繼資料(如軸名稱等)。

構建Series或DataFrame時,所用到的任何陣列或其他序列的標籤都會被轉換成一個Index,且Index物件是不可修改的:

Index的功能類似一個固定大小的集合:

基本功能

1、重新索引

方法 reindex:創建一個適應新索引的新物件。

調用該Series的reindex將會根據新索引進行重排。如果某個索引值當前不存在,就引入缺失值。

對於時間序列這樣的有序數據,重新索引時可能需要做一些差值處理:

對於DataFrame ,reindex可以修改行、列索引,或兩個都修改。如果僅傳入一列,則會重新索引行:

使用columns關鍵字可重新索引列:

同時對列、欄進行索引:

ix標籤索引功能:

丟棄制定軸上的項

drop方法返回的是一個在指定軸上刪除了指定值的新對象:

對於DataFrame,可以刪除任意軸上的索引值:

2、索引、選取和過濾

Series索引的工作方式類似於NumPy陣列的索引,但Series的索引值不只是整數:

利用標籤的切片運算,其包含閉區間(與普通 python 切片運算不同):

對DataFrame進行索引就是獲取一個列:

或多個列:

這種索引方式的特殊情況:透過切片或布林型陣列選取行。

另一種用法是透過布林型DataFrame進行索引(在語法上更像 ndarray):

專門的索引欄位 ix,是一種重新索引的簡單手段:

3、算數運算和數據對齊

pandas最重要的一個功能是對不同索引的物件進行算數運算。

對不同的索引對,取並集:

自動的資料對齊操作在不重疊的索引出引入了NA值,即一方有的索引,另一方沒有,運算後該處索引的值為缺失值。

對DataFrame,對齊操作會同時發生在行和列上。

4、在算術方法中填充值

對運算後的NA值處填充一個特殊值(比如 0):

否則 e 列都是NaN值。

類似,在對Series和 DataFrame 重新索引時,也可以指定一個填充值:

用這幾個特定字的,叫算術方法:add/ sub/ div/ mul ,即:加/減/除/乘。

5、DataFrame 和 Series 之間的運算

計算一個二維陣列與其某行之間的差:

這個就叫做廣播,下面的每行都做這個運算了。

預設情況下,DataFrame和Series之間的算數運算會將Series的索引匹配到DataFrame的列,然後沿著行一直向下廣播:

得到

做加法 frame+series2,找不到的值就並集為NaN。

如果你希望匹配行,且在列上廣播,則必須使用算數運算方法:

傳入的軸號就是希望匹配的軸。

6、函數的應用和映射

NumPy的ufuncs可用於操作pandas物件,以abs為例:

DataFrame 的 apply 方法:將函數應用到各列或行所形成的一維陣列上:

許多最為常見的資料統計功能都被封裝為DataFrame的方法,無需使用apply方法。

除標量值外,傳遞給apply的函數還可以返回由多個值組成的Series:

用 applymap 得到frame中各個浮點值的格式化字串:

Series有一個用於應用元素級函數的 map 方法:

7、排序和排名

sort_index方法:返回一個已排序的新物件

對於DataFrame,可以根據任意一個軸上的索引進行排序:

指定了axis=1,是對列進行排序。

默認按昇冪,降冪用ascending=False:

對Series進行排序,可用方法sort_values():

在排序時,任何缺失值預設都會被放到Series末尾。

在DataFrame上,用by根據列的值進行排序:

根據多個列:

rank方法:預設情況下,rank是透過“為各組分配一個平均排名”的方式破壞平級關係的。

根據值在原資料中出現的順序給出排名:

按降冪進行排名:

DataFrame可以在行或列上計算排名:

8、帶有重複值的軸索引

雖然許多pandas函數都要求標籤唯一(如 reindex),但這不是強制性的。

帶有重複索引的Series:

索引的is_unique屬性可以判斷它的值是否唯一。

帶有重複索引的DataFrame:

在Pandas中,DataFrame.ix[i] 和 DataFrame.iloc[i] 都可以選取 DataFrame 中第i行的資料,那麼這兩個命令的區別在哪裡呢?

ix可以透過行號和行標籤進行索引,而iloc只能透過行號索引,即ix可以看做是loc和iloc的綜合。

匯總和計算描述統計

pandas物件擁有一組常用的數學和統計方法:用於從Series中提取單個值,或從DataFrame的行或列中提取一個Series。

跟Numpy陣列方法相比,它們都是基於沒有缺失資料的假設而構建的。

傳入 axis=1 將會按行進行求和運算:

NA值會自動被排除,如 1.40+NaN=1.40, NaN+NaN=0.00。

透過skipna選項可以禁用該功能:(得到 1.40+NaN=NaN, NaN+NaN=NaN)

返回間接統計(輸出了值所在的行名):

累計型的(樣本值的累計和):

一次性產生多個匯總統計:

對於非數值型資料,describe會產生另外一種匯總統計:

1、相關係數與協方差

Series和DataFrame:

  • corr方法: 相關係數
  • cov方法:協方差

DataFrame的corrwith方法:計算其列或行跟另一個Series或DataFrame之間的相關係數。傳入一個DataFrame計算按列名配對的相關係數,傳入axis=1即可按行進行計算。

2、唯一值、值計數以及成員資格

從一維Series的值中抽取信息。

unique函數:得到Series中的唯一值陣列

value_counts:用於計算一個Series中各值出現的頻率:

Series按降冪排列。value_counts是一個頂級pandas方法,可用於任何陣列或序列。

isin:用於判斷向量化集合的成員資格,可用於選取Series或DataFrame列中資料的子集:

處理缺失資料

pandas的設計目標之一就是讓缺失資料的處理任務儘量輕鬆。

pandas使用浮點值 NaN(Not a Number) 表示浮點和非浮點陣列中的缺失資料。它只是一個便於被檢測出來的標記而已。

python 內置的None值也會被當做NA處理(如 string_data[0]=None)。

1、濾掉缺失數據

對於一個Series, dropna返回一個僅含非空資料和索引值的Series:

透過布林型索引也可以達到這個目的:

對於DataFrame物件,dropna預設丟棄任何含有缺失值的行:

丟棄全為NA的那些行,axis=1則丟棄列:

只想留下一部分參數,用thresh參數:

thresh=3:保留至少 3 個非空值的行,即一行中有 3 個值是非空的就保留.

2、填充缺失數據

fillna方法:透過一個常數調用fillna就會將缺失值替換為那個常數值。

透過一個字典調用fillna,可以實現對不同的欄填充不同的值:

fillna預設會返回新物件(副本),但也可以對現有物件進行就地修改:

插值方法(對 reindx 有效的也可用於 fillna):

你可以用fillna實現許多別的功能,比如傳入Series的平均值或中位數:

層次化索引

在一個軸上用多個(2 個以上)索引級別,即以低維度形式處理高維度數據。

MultiIndex 索引的 Series 的格式化輸出形式:

選取資料子集:

在【內層】中進行選取:

層次化索引在資料重塑基於分組的操作中很重要。比如說,上面的資料可以透過其 unstack 方法被重新安排到一個DataFrame中,它的逆運算是 stack:

對於一個DataFrame,每條軸都可以有分層索引:

各層都可以有名字(可以是字串,也可以是別的 Python 物件)。
注意不要將索引名稱軸標籤混為一談。

有了分部的欄索引,可以輕鬆選取欄分組。

可以單獨創建 MultiIndex 然後複用。上面的DataFrame中的分級列可以這樣創建:

1、重排分級順序

重新調整某條軸上各級別的順序,或根據指定級別上的值對資料進行排序。

swaplevel:接受兩個級別編號或名稱,返回一個互換了級別的新物件,資料不發生改變:

sortlevel:根據單個級別中的值對資料進行排序(得到的最終結果是有序的)

2、根據級別匯總統計

level選項:用於指定在某條軸上求和的級別。

如下所示,分別根據行或列上的級別來對列、對欄進行求和:

3、使用DataFrame的列

將DataFrame的一個或多個欄當做行索引來用,或將列索引變成DataFrame的欄:

set_index函數:將其一個或多個欄轉換為列索引,並創建一個新的DataFrame。

預設情況下,那些欄會從DataFrame中移除,也可以將其保留下來:

reset_index:將層次化索引的級別轉移到列裡面(和 set_index 相反)

不足之處,歡迎指正。

我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。

已經有2800+的同好按贊我的臉書了,你不來嗎?XD

可以給50個clap,你們也別太辛苦,49個就行^~^!感謝支持小編

往期內容:

學習計劃|帶你10周入門資料分析

4招教你煉就資料分析的思維

數據分析慣用的5種思維方法

資料分析必備的43个Excel函式,史上最全!

實操:如何用Excel做一次完整的資料分析

寫給新人的資料庫入門指南

零基礎快速自學SQL,2天足矣!

資料視覺化技能的進階路線:SQL+BI+Echarts

數據分析必掌握的統計學知識!

不可不知描述性統計

資料分析必備的統計學(二):假設檢驗

一次讓人臉紅心跳的python數據分析

Python入門(一)環境&資料結構

Python入門(二)函數基礎

Python資料分析(三)NumPy

--

--

數據分析那些事

這是一個專注於數據分析職場的內容部落格,聚焦一批數據分析愛好者,在這裡,我會分享數據分析相關知識點推送、(工具/書籍)等推薦、職場心得、熱點資訊剖析以及資源大盤點,希望同樣熱愛數據的我們一同進步! 臉書會有更多互動喔:https://www.facebook.com/shujvfenxi/