Numpy的軸,pandas的行和列

使用幕布做了一系列詳細筆記請點擊:

數據分析的工具1:Numpy

數據分析工具2:pandas

數據分析工具3:數據清洗和準備

數據分析工具4:數據聚合、合併和重塑


高維ndarray的軸

  • 軸編號和索引傻傻分不清楚

很多函數需要傳入軸編號,非常容易和索引弄混,以3維數組為例,軸有3條,編號分別為 0,1,2

我們製造一個3×3×3的3維數組:

arr3d=np.array([[[1,2,3],[4,5,6],[7,8,9]],[[10,11,12],[13,14,15],[16,17,18]],[[19,20,21],[22,23,24],[25,26,27]]])arr3d.shape

輸出

(3, 3, 3)

arr3d數組的shape元組為(3,3,3),元組的索引為 [ 0,1,2 ]

可以看到軸編號和shape元組的索引是對等的,所以這個編號可以理解為高維ndarray.shape產生的元組的索引

  • 軸是什麼鬼

數組就是按照下面的順序儲存的:

[ [ [1,2,3] , [4,5,6] , [7,8,9] ] , [ [10,11,12] , [13,14,15] , [16,17,18] ] , [ [19,20,21] , [22,23,24] , [25,26,27] ] ]

最內層一對 [ ] 可以代表一個1維數組,加粗的一對 [ ] 裡面有3個一維數組,也就是2維數組,最外層的一對 [ ] 裡面有3個2維數組也就是3維數組

我們知道shape(3,3,3)表示數組的維度,既然shape的索引可以看做軸編號,那麼一條軸其實就是一個維度,0軸對應的是最高維度3維,1軸對應2維,2軸對應的就是最低維度的1維。

數組中其實不存在行和列的概念,為了便於理解,我們畫一個具有行和列的九宮格把3維數組裝進去

每個方塊代表一個1維數組,最低維的軸編號2

1行3個1維數組組成了1個3×3的2維數組,所以行代表2維數組,2維的軸編號1

3行2維數組組成了3×3×3的3維數組,所以列代表3維數組,3維的軸編號0

由3個2維數組組成的3維數組,每個2維數組中包含3個1維數組

  • 什麼叫沿軸切片

創建1個3×3的2維數組arr2d(例子來自《利用Python進行數據分析》第四章)

arr2d=np.array([ [1,2,3] , [4,5,6] , [7,8,9] ])arr2d

輸出

array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

arr2d的shape元組為 ( 3,3 ) ,這個元組的的索引為 [ 0,1 ] ,表示arr2d這個2維數組有兩條軸0軸和1軸

首先看1個參數的切片操作

arr2d[:2]

這裡有個很重要的概念, :2 是切片的第一個參數,約定俗成第一個參數就代表0軸,0軸表示2維,所以這個切片是在2維這個維度上切的,(書中原文「沿0軸切」)

arr2d的2維上是3個1維數組,這3個1維數組當然也有索引號也是[0,1,2],[ :2 ] 就表示它要切取2維(0軸)上3個1維數組中的索引 [ 0 ] 和索引 [ 1 ] ,於是得到 ([ 1, 2, 3 ]) 和 ([ 4, 5, 6 ]) 這兩個1維數組,我們看下輸出

輸出

array([[1, 2, 3], [4, 5, 6]])

兩個參數的切片:

arr2d[:2,1:]

就是在兩個維度(軸)上各切一刀,第1個參數就是2維(0軸), :2 表示切取2維(0軸)上的索引 [ 0 ] 和索引 [ 1 ] ,即 ([ 1, 2, 3 ]) 和 ([ 4, 5, 6 ]) 這兩個1維數組

第2個參數就是1維(1軸),1: 表示切取1維(1軸)上的索引 [ 1 ] 和索引 [ 2 ] ,即對數組 ([ 1, 2, 3 ]) 取 ([ 2,3 ]) ,對數組 ([ 4, 5, 6 ]) 取 ([ 5,6 ])

我們看下輸出

輸出

array([[2, 3], [5, 6]])

  • 傳入軸編號怎麼理解

《利用Python進行數據分析》書中的高維數組transpose方法,書中原話是比較費腦子,它是醬嬸的:

arr = np.arange(16).reshape((2, 2, 4)) arr

輸出

array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [12, 13, 14, 15]]])

看下它的shape,其實是設置的時候自己輸入的,但是可以給把這個元組賦值給一個變數

tup=arr.shapetup

輸出

(2, 2, 4)

tup的索引 [ 0,1,2 ] 就是3維數組arr的軸編號

下面轉換它

arr.transpose((1, 0, 2))

3維數組arr的1維(2軸)上是4個一維數組,每個1維數組都有一個由0,1兩個軸編號組成的索引 [ 0,0 ] , [ 0,1 ] , [ 1,0 ] , [ 1,1 ],transpose方法傳入的參數是軸編號 (1, 0, 2) 在就是把tup的索引順序改變成 [ 1,0,2 ] 也就是把 arr [ 0,1 ] 的一維數組變成 arr [ 1,0 ]

輸出

array([[[ 0, 1, 2, 3], [ 8, 9, 10, 11]], [[ 4, 5, 6, 7], [12, 13, 14, 15]]])


DataFrame的行和列

對於Pandas的DataFrame來說,因為擁有行和列的標籤,所以只要能夠理解Excel就可以理解DataFrame的行和列

  • 行和列的等級關係

由嵌套字典構成的DataFrame可以幫助我們理解

{Nevada: {2001: 2.4, 2002: 2.9},Ohio: {2000: 1.5, 2001: 1.7, 2002: 3.6}}

pandas就會被解釋為:外層字典的鍵作為列,內層鍵則作為行索引,根據以往經驗外層的維度比內層高


  • DataFrame的行

axis=0表示0軸,0軸上是一列行索引,當函數傳入參數axis=0,就是根據行索引來操作數據,可以看做同時操作幾列對齊索引的Series,例如:

1.排名:就是對每個Series分別排名,即每列單獨進行排名

2.濾除缺失值:

默認情況:如果有NaN值就按對應索引,同時把幾個Series的該索引對應的數據刪除,即一行里有一個NaN就把該行刪除

how=all:如果幾個Series相同的索引對應的數據都為NaN,就刪除該索引對應的數據,即一行都為NaN就刪除該行

3.連接:就是將一個Series與另一個Series連接,同時對幾個Series進行此操作,即將新數據連接在列方向


  • DataFrame的列

axis=1表示1軸,1軸上是一行列索引,當函數傳入參數axis=1,就是根據列索引來操作數據,例如:

1.排名:每行單獨進行排名

2.濾除缺失值:

默認情況:一列里有一個NaN就把該列刪除

how=all:一列都為NaN就刪除該列

3.連接:將新數據連接在行方向


  • 按行或列取值

.iloc使用全是以0開頭的行號和列號,不能直接用其它索引哦。而.loc使用的實際設置的索引和列名。 這就是.loc和.iloc的區別。在實際運用中,我還發現一點區別,.iloc只能選取數據表裡實際有的行和列,而.loc可以選取沒有的行和列,賦值後就可以添加新行或者列


推薦閱讀:

關於模型檢驗的ROC值和KS值的異同_ROC曲線和KS值
R語言knitr之rmarkdown
奧威OurwayBI教程《養成數據思維,分析工具get起來》開課啦 !
R語言實戰|數據結構學習筆記
第二講學習筆記:數據結構

TAG:Python | 數據分析 | 數據分析工具 |