此文是《10周入門資料分析》系列的第16篇
想瞭解學習路線,可以先閱讀 學習計畫 | 10周入門資料分析
上篇介紹了 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個就行^~^!感謝支持小編