標籤:

pandas複習總結(二)

本文繼續給大家總結pandas相關知識,標題如下:

  1. 索引、選取、和過濾
  2. 算術運算與數據對齊
  3. 算術方法
  4. ufuncs和統計函數
  5. 排序排名
  6. 唯一值、值計數、以及成員資格
  7. 缺失值處理
  8. 缺失值處理之過濾缺失值
  9. 缺失值處理之填充缺失值

索引、選取、和過濾

Series的索引和numpy類似,並且Series的索引值不僅能為整數,還能利用索引對象與值的映射關係去選取元素,這些在上一篇介紹Series已經提到過了。但還有一點需要注意的是,numpy、列表以及元祖的切片操作是不包含末端的,而Series利用標籤切片是包含末端的。(用整數索引和正常切片是一樣的)

而對DataFrame的索引可以索引DataFrame的一個或多個列。

同時,用軸標籤去將DataFrame切片仍然是包括末端的。

但我們對DataFram使用布爾索引進行數據選取的時候

我們可以看到,如果某一行里存在符合條件的元素,那麼這一行就會被選出來,但是作為結果的DataFrame不符合條件的元素會變成缺失值。但是如果我們目的是對這一些符合條件的元素操作,結果和numpy是一樣的

此外,pandas還有層次化索引,它使你能在一個軸上擁有多個索引級別。以下是用層次索引的例子。

我們可以在創建的時候傳入一個二維的列表或者數組隱式的創建層次索引。我們還可以通過

pd.MultiIndex顯式的創建多層索引對象。例子如下。

上面的例子的結果是相同的。如果索引為不同層次的標籤的組合,你還可以使用.from_product來創建多層索引,這樣你就無須枚舉所有的索引。

我們可以通過.index查看層次索引的構成

層次索引由兩部分組成,levels描述索引所在的位置,levels[ 0 ]對應最外層的索引的取值,labels[ 0 ]對應位於最外層索引在不同位置的取值,如最外層索引的前三個索引標籤都是a,因此label[ 0 ]開頭對應30,如此類推。

層次索引必須從外向內索引(左邊為外),如果只想用內層索引,則外層索引必須為全切片。

算術運算與數據對齊

pandas最重要一個的功能是,它支持對不同索引對象進行算術運算。如果兩個對象含有不同的索引,則結果的索引對象為兩者的並集。

我們可以看到s1 s2相加的結果,索引相同的元素相加,只有一邊獨有的索引為缺失值,並且結果的索引為s1 s2 索引的並集。DataFrame也是如此。

算術方法

如果兩個對象含有不同的索引,那麼它們之間運算的結果會出現缺失值。pandas提供了add、sub、div、mul 這些方法可以指定 fill_value 參數,當在運算過程中存在不匹配的索引時,就會用fill_value 填充使得索引匹配,結果不產生缺失值。

可以看到,結果中沒有缺失值,其結果相當於將兩個DataFrame補全並把NaN值填充為指定值之後在相加。

有些時候我們會讓Series對象和DataFrame對象運算,例如

默認情況下,會把Series的索引與DataFrame的列索引匹配,然後沿著行一直傳播。

顯然由於DataFrame的列索引和Series的索引沒有交集,並且由於廣播的效果,使得結果全為NaN,如果我們想在列上廣播,必須使用算術方法,並指定軸。

ufuncs和統計函數

ufuncs同樣可以用於操作pandas對象,用法和numpy一樣,這裡就重複介紹了。但是還有一種操作就是:將函數應用到各列或各行的一維數組上,DataFrame的apply方法可以實現此功能

其中lambda表達式是匿名函數,它令代碼更加簡介,上面的例子把函數f應用到每一列,計算出每一列的極值。除了標量以外,apply還可以返回Series 。(返回的值Series與原來的列索引對應變成了DataFrame)

此外,Python元素級的方法同樣可以使用,這時要藉助applymap,下面這個例子,把DataFrame的元素格式化為浮點數。

之所以叫applymap是因為Series有一個用於應用到元素級函數的map方法。

pandas 統計方法也與numpy,他們一般都有一下三個參數。

由上表我們可以知道,pandas的統計函數會自動忽略缺失值,除非整個行或列都是缺失值,否則,結果不為缺失值。

pandas除了常見的求最大最小值(位置索引),累加和等等外,也有一些numpy中沒有的統計函數。如count()用於計算缺失值的個數,還有用於計算百分數變化的pct_change()等等,在這裡就不一一描述,使用前看一下官方文檔即可。

排序排名

pandas既可以對索引排序也能對數據排序,對索引排序的時候使用實例方法.sort_index() ,他可以通過指定axis來選擇沿那一條軸進行排序(0對應行,1對應列)。排序默認為升序,若想按降序排序令ascending = False 即可。

若想對數據排序,則會用到order方法,若想按照莫一列進行排序指定 by = 對應的列索引即可。注意缺失值在排序時都會放在最後。

pandas 有一個類似argsort的方法,他返回各個元素的大小排名,但與argsort不同的時,rank方法存在破壞平級關係的規則,默認情況下兩個具有相同值的排名為它們組的平均排名。例如

總共有7個數據,如果按順序排兩個7肯定佔據第6,7位,因此他們的平均排名為6.5。當然我們可以指定method參數打破這種平級關係,如果我們指定methodfirst,那麼先出現的元素的排名會靠前。還有其他的選項分別為min,max。

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

在面對大量數據的時候,我們要想方設法的從Series的取值中抽取信息。如果,我們想的得到Series的唯一值數組我們可以使用unqiue函數

注意unique函數返回的是未排序序列。

我們也常常會用到value_count()方法,對某一列或某一行統計取值出現的頻率並默認按降序排序返回。

索引標籤為唯一值數組,並且按照降序排序,對應的值為標籤的頻率。

我們還有isin()方法用於判斷矢量化集合的成員資格圖,它可以返回與對象相同尺寸但取值為布爾值的對象,常用於數據選擇

缺失值處理

缺失數據在正常數據集是非常常見的,為了讓數據集能夠正常的使用,使用前都會對缺失值進行處理,pandas提供isnull()方法返回一個含有布爾值的對象。notnullisnull的否定式。

缺失值處理之濾去缺失值

我們可以使用dropna方法去刪除缺失值。但刪除對於DataFrame來說就複雜很多,你有可能只希望丟棄全為NaN的行或列,或者只要有缺失值,你都要將某行或某列丟棄。dropna默認丟棄含有缺失值的行,我們可以設置axis使得我們可以丟棄含有缺失值的某列。如果我們只想丟棄全為NaN的行,設置how = 『all』即可。

缺失值處理之填充缺失值

我們可以使用fillna去填充缺失利用值而不是丟棄它,因為有些時候,數據是十分稀有寶貴的,要盡量重複利用,所以儘可能的去填充合理的值,例如(眾數、均值等等)。fillna可以接受標量也可以接受字典,通過字典(列索引為鍵),就可以實現對不同的列填充更合理的值。fillna默認返回新對象,令inplace = False可以讓對象就地修改。

另外fillna可以使用插值的方式填充數據,默認為ffill,這裡的用法和reindex的填充是一樣的。

本文首發於公眾號「AI遇見機器學習」,更多乾貨可搜索[mltoai]或直接公眾號名,歡迎關注!

推薦閱讀:

Python數據分析之鎖具裝箱問題

TAG:Python |