Chapter 5 Python Rectangular Data

matrix與data frame兩個方形資料並不是Python的基本資料儲存類型,它只是基本類型的擴充。

  • matrix: 依賴numpy模組, list的延伸

  • data frame: 依賴pandas模組, dict的延伸

5.1 Matrix

5.1.1 產生

以list方式輸入:

  • 矩陣維度\(n\times m\): list有n個元素,每個元素又分別是個帶有m個元素的list, 以下面\(3\times 5\)矩陣為例:

\[M=\left[\begin{array}{ccccc} 7 & -9 & -5 & 10 & -13\\ 12 & -6 & -3 & -6 & -14\\ 7 & -5 & -4 & 1 & 5 \end{array}\right]\]

  • numpy只是將list物件賦予它一些矩陣操作的彈性。

5.1.2 元素粹取

[.row,.col]取法,其中:

  • .row, .col: a position, list of positions, slice of positions, 或與維度總長相同的list of booleans。

numpy與pandas對axis的定義相同:

  • np.sum(…, axis=0): 每個col延其row元素相加
    np.sum(…, axix=1): 每個row延其col元素相加

5.1.3 numpy copy method

np.array是list的延伸,不但多了一些新的method,對list底下的某些method也有改寫,其中

  • copy method不再是shallow copy而是deep copy.
    Matrix2=Matrix1.copy()兩者不會連動。

  • 定義式複製(Matrix2=Matrix1)還是會連動。

DataFrame.copy(self, deep=True)

5.2 Data frame

以dictionary方式輸入。

5.2.2 元素粹取

分成一維[.]及二維[.,.]取法

5.2.2.1 一維取法

只能用在

  • (取column)label名稱(string or list of strings)取column series

  • (取row)positions slicing (其他positions非slicing寫法均不行,所以list of positions不可以用)取row data

  • (取row)list of booleans取row data: list長度要與總row數相同。

label名稱取column series

list of booleans取row data

position slicing選row

pandas copy method

data frame是dictionary的延伸,不但多了一些新的method,對dictionary底下的某些method也有改寫,其中

  • copy method不再是shallow copy,default為deep copy.
DataFrame.copy(self, deep=True)

dict copy是shallow copy

data frame copy不再是shallow copy

5.2.2.2 二維取法

依維度表示形式分成.loc[.,.].iloc[.,.]兩類:

  • .loc[.row,.col]:
    • .row以index表示,.col以label表示。
  • .iloc[.row,.col]:
    • .row及.col為position或list of booleans。

二維取法下.row或.col要全取時用:表示。

5.2.2.2.1 .loc[,]
  • .loc[,]是很直覺的取法,print data frame時自然會看到 index:label

只有position slicing時,如start:end才「不會包含」end,其他slicing會包含end。

5.2.2.2.3 pandas index

針對每一筆資料原始來源代表單位的ID值

df_grade0最左側0-4即為每一筆資料的id, 不同id在這裡會代表不同人

取出放回random sample 10筆資料,相同index值表示來源相同。

.set_index(): column改為index

將某個column改為index

5.2.2.2.3.1 .set_axis(): 設定index值

此時出現警示,希望你增加inplace=True,因為未來default會是False。

pandas視column label為一種index,所以也可以用set_axis改column labels.

5.3 應用

適時的將list of monotomic types轉成np.array,將dictionary轉成pd.dataFrame可以減化程式複雜度。

  • 取元素較容易。

  • 可以直接做向量的運算,不用以comprehension或迴圈方式做。(不見得比較快,只是較直覺)