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。
M
M_list[1][3]
# M_list[1,3] # list 不能這麼做
M
M[1][3]
M[1,3] # a position
M[[0,2],:] # list of positions. columns 全取要寫`:`
M[[0,2],2:5]
M[[True,False,True],:] # list of booleans
M[:,[True,True, False,False,False]]
M[:,np.sum(M)>0] # 只取sum across row>0的column
M[np.sum(M,axis=1)<0,:] # 只取sum across col<0的row
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.1 產生
5.2.1.1 由dictionary
dict_grade={
'學號': [172,214,322,425,517],
'姓名': ["小明","大雄","胖虎","小新","大白"],
'成績': [80,60,90,70,50]
}
df_grade0=pd.DataFrame(dict_grade)
不只dict的class改變,其內部元素的type也有變化(均為Series)
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
df_grade1
df_grade1['學號']
df_grade1.學號 # 取一個時也可用`.`
# 選多個Series
df_grade1[['學號','姓名']] # 比dictionary多此彈性
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
dict_grade
dict_grade1=dict_grade.copy()
dict_grade1['成績'][0]=85
dict_grade1
dict_grade # 受dict_grade1變動影響
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.2 .iloc[,]
- position selection:較不直覺,要去數
df_grade0.iloc[0,1]
df_grade0.iloc[2:4,1] # 比df_grade0.loc[2:4,"姓名"] 少了 index 4
df_grade0.iloc[2:5,1] # = df_grade0.loc[2:4,"姓名"]
df_grade0.iloc[2:5,0:1] # 比df_grade0.loc[2:4,"學號":"姓名"] 少了'姓名'
df_grade0.iloc[2:5,0:2] # = df_grade0.loc[2:4,"學號":"姓名"]
list of booleans取法在.iloc[,]要list,若不是list則不適用在.iloc[,],但可用在.loc[,]
5.2.2.2.3 pandas index
針對每一筆資料原始來源代表單位的ID值
df_grade0最左側0-4即為每一筆資料的id, 不同id在這裡會代表不同人
取出放回random sample 10筆資料,相同index值表示來源相同。
.reset_index(): 將index改為column
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或迴圈方式做。(不見得比較快,只是較直覺)
5.3.1 list
- 計算numList每個值+3
- 判斷numList每個值是否>10
5.3.2 dictionary
找出dict_finStatement中’營業利益(損失)‘為負的’公司名稱’