從零開始學Python【4】--pandas(序列部分)
上一期我們介紹了數據分析中常用的numpy模塊,從數組的創建、元素的獲取、數學+統計函數、隨機數的生成、到外部文件的讀取。這期我們再來介紹另一個重磅的數據分析常用模塊--pandas。該模塊更像是R語言中的向量、數據框的處理,接下來我們就一一介紹里面的小知識點。
序列
序列(Series)可以理解成是R語言中的向量,Python中的列表、元組的高級版本。為什么說是高級版本呢?因為序列與上期介紹的一維數組類似,具有更好的廣播效應,既可以與一個標量進行運算,又可以進行元素級函數的計算。如下例子所示:
列表與常數10相加,報錯,顯示無法將列表與整形值連接,“+”運算在列表中是連接操作。
將上面的列表轉換成一個序列后,就可以正常的完成運算,這就是序列的廣播能力。同樣,列表也不能用于元素級的數學函數,對比如下:
除了上面介紹序列功能,再來說說其他序列常用的場景,如序列的索引、成員關系、排重、排序、計數、抽樣、統計運算等。
序列的索引:
由于序列是列表的擴張版,故序列也有一套類似于列表的索引方法,具體如下:
>need-to-insert-img
用倒數的方式取元素,序列就顯得不是很方便了,我們推薦使用非常棒的iat方法,該方法不管應用于序列還是數據框都非常優秀,主要體現在簡介而高速。然而,實際工作中很少通過位置索引(下標)的方法獲取到序列中的某些元素,例如1000個元素構造的序列,查出屬于某個范圍值總不能一個個去數吧?序列提供了另一種索引的方法--布爾索引。具體用法如下:
我們知道,在R語言中一個向量的元素是否包含于另一個向量,可以使用%in%函數進行判斷,同理,Python中也有類似的方法。對于一個一維數組,in1d函數實現該功能;對于一個序列,isin方法可實現該功能。
numpy模塊中的in1d函數也可以用于序列的成員關系的比較。
如果手中有一離散變量的序列,想查看該序列都有哪些水平,以及各個水平的頻次,該如何操作?
沒錯,只要借助于unique函數(與R語言一樣的函數)實現序列的排重,獲得不同的水平值;通過使用value_counts函數(對應于R語言的table函數)對各個水平進行計數,并按頻次降序呈現。
有的時候需要對某個序列進行升序或降序排序,雖然這樣的場景并不多,但排序在數據框中的應用還是非常常用的,先來看看如何對序列進行排序:
s.sample(n=None, frac=None, replace=False, weights=None, random_state=None,axis=None)
n:指定抽取的樣本量;
frac:指定抽取的樣本比例;
replace:是否有放回抽樣,默認無放回;
weights:指定樣本抽中的概率,默認等概論抽樣;
random_state:指定抽樣的隨機種子;
抽樣也是數據分析中常用的方法,通過從總體中抽取出一定量的樣本來推斷總體水平;或者通過抽樣將數據拆分成兩部分,一部分建模,一部分測試。pandas模塊提供了sample函數(與R語言的sample函數一致)幫我們完成抽樣的任務。
由于總體就是男、女性別兩個值,故需要抽出10個樣本,必須有放回的抽,而且男女被抽中的概率還不一致,女被抽中的概率是0.8。
統計運算
pandas模塊提供了比numpy模塊更豐富的統計運算函數,而且還提供了類似于R語言中的summary匯總函數,即describe函數。
其中count是序列中非缺失元素的個數。哦,對了,如何判斷一個序列元素是否為缺失呢?可以使用isnull函數,等同于R語言中的is.na函數。
除此,我們再來羅列一些常用的統計函數:
s.min() # 最小值
s.quantile(q=[0,0.25,0.5,0.75,1]) # 分位數函數
s.median() # 中位數
s.mode() # 眾數
s.mean() # 平均值
s.mad() # 平均絕對誤差
s.max # 最大值
s.sum() # 和
s.std() # 標準差s.kurtosis() # 峰度
s.cumsum() # 和的累計,返回序列
s.cumprod() # 乘積的累積,返回序列
s.product() # 序列元素乘積
s.diff() # 序列差異(微分),返回序列
s.abs() # 絕對值,返回序列
s.pct_change() # 百分比變化 ,返回序列s.corr(s2) # 相關系數
s.ptp() # 極差 R中的range函數
今天我們的內容就介紹到這邊,歡迎大家拍磚。下期我們來聊聊pandas模塊的數據框