數據分析的python基底(3)——array、Series、DataFrame筆記
來自專欄 猴子聊數據分析
《利用python進行數據分析》的第4、5章介紹了兩個非常重要的包,NumPy和Pandas,這篇文章是我看這兩章做的筆記,只列了要點和我覺得要留意的地方。
電子書和配套代碼,還有一些學習資源,猴子在這裡都提供拉:
猴子:如何學習《利用python進行數據分析》這本書?(我看的是英文新版,針對Python3,信我,英語過四級的絕對能看懂,別怕!)
Ch4. NumPy
NumPy包中最重要的對象是多維數組(ndarray),數組裡的數據叫元胞(cell)。
ndarray(簡稱array)
數組內元胞必須是同種數據類型,shape-查看行列,.dtype-查看元胞類型,.ndim-查看維度。修改元胞類型可用.astype(np.float64),這個方法可以把string類型的數值轉換成純數值。
構造方法
(不加dtype參數的話默認創建float64類型)
- list轉array,np.array,指定元素類型:arr = np.array([1,1,2], dtype = np.int32),註:元素等長的list轉換成array會變成多維
- np.zeros(shape),單個數字就是一維的,兩個是二維(行,列)
- np.empty((length,shape)),例np.empty((2,2,3)),只分配地址,不賦初值
- np.full((shape),fill_value)
- np.arange(5),結果是array([0,1,2,3,4])
- arr2 = np.ones_like(arr1) 或zeros_like(arr1),
- np.random.normal(size=(4,4)),標準正態分布
- array最重要的特徵是「向量化」,等長的array間能進行數學運算。
- array的切片和list不同,array的切片不是copy,而是映射view,提取切片修改它的數值原始的array也會被修改!要想複製可用arr[5:8].copy()。切片里可以直接用判斷語句,如data[data < 0]
- 一個神奇的功能:可以用boolean判斷得到的True作為數組的下標,但boolean數組必須與目標數組等長,返回的是copy,例子:
4. 「fancy index」 :arr[[1, 5, 7, 2], [0, 3, 1, 2]],這裡選擇的是(1,0),(5,3),(7,1),(2,2)
5. array.T,最正常的轉置。transpose和swapaxes用shape去理解,<詳細例子理解> 如:transpose(2,1,0) = shape[0,1,3]—>[3,1,0] , swapaxes(2,1) = shape[0,1,3]—>[0,3,1]
array里一些好用的函數
- np.where(條件con,替代值x,替代值y),相當於語句x if con else y. 例如np.where(arr>0, 2, arr),數組arr中大於0的元胞變成2,其他不變。
- 求統計值系列:.mean/sum/cumsum(累加)/cumprod(累乘)/min/max/std/var(方差)…...可帶參數axis指定計算方向,0列1行。(這樣能實現統計學上的降維,估計是為了建模時擬合度更好。)
- 排序sort(1),參數0列1行
- 集合屬性系列:僅對一維數組有效
Ch5. Pandas
Series
Series就是帶索引(index)的一維array,開頭的S必須大寫。
構造方法
- obj = pd.Series([4, 7, -5, 3], index=[d, b, a, c])。不帶參數的話默認使用數字索引0、1、2….(這裡,為了避免數字索引和行數混淆,如果索引是int,在切片時默認[]內是索引而不是行數)
- .Series(dict) 傳入字典,key自動作為索引
關於索引
- 注意,用[索引]切片時左右都是閉區間,如obj[b:c]是b和c行,用行數切片時是左閉右開,如obj[1:3]是1、2行
- 可以通過索引訪問、修改元素,多個索引這樣表示:s[[a,c]]
- 可以直接新增元素,obj[d] = 6
- s.index查看索引和類型(索引不是非要int)
- 對Series使用函數,作用的是Series的copy,要賦值後才會改變Series本尊,比如s.reindex([b,a,d,c])修改下標,s本身不會變,要s=s.reindex([b,a,d,c])才行。
- 常用isnull, notnull查缺失值,.sort_index默認按行升序
關於axis的特別提醒
看了一些例子後搞不清楚axis=1到底是按行還是按列。。其實正確來記axis應該被當做動詞理解,就是axis=0代表往跨行(down),而axis=1代表跨列(across),
換句話說:
- 使用0值表示沿著每一列或行標籤索引值向下執行方法
- 使用1值表示沿著每一行或者列標籤方向執行對應的方法
DataFrame
理解成「表」,每一列的數據可以是不同類型,每一列是一個Series。列索引叫column,行索引叫index,它們還能有更具體的名字表達實際含義,(看起來更像一張表了)例子:
構造方法
- np.DataFrame(),傳入等長字典(嵌套字典也行)、list或者array,可指定參數column與index
- 讀取文件,比如.read_csv(),.read_Excel()
增刪改查
- 由列索引讀取某列數據:df.name或df[name]。name列不存在的話直接df[name]=[…]就會創建,但df.name不行。
- 由行、列索引讀取:df.loc[a:c,』age『],ac是行索引,age列索引
- 由行數、列數讀取:如df.iloc[1]是第二行,df.iloc[2,[0,1]]是第三行的一、二列
- df[(df.class ==second) & (df.age < 20)],[]里寫查詢條件,或者用query函數里寫SQL語句:df.query((age < 20) and (class=="second"))
- 聯合起來用,df.iloc[ :,:3 ][ df.age>5 ],在指定區域查找
- 粗暴地刪除某列用 del df[age]或 df.drop(age,axis=1),刪除某行 df.drop(行索引)。如果想只刪除age列為14,15,16的某幾行可以這樣寫:df=df[(True-df[age].isin([14,15,16]))] ,參考自<這裡>
- 修改某列Series的類型,df.age = df.age.astype(str) (牢記上面提到的函數對Series的copy起作用)。
一些函數
排序 .sort_value(by=[索引])
.rename(index= ,columns= ),實際上當做「複製df」來用而不是中文字面的重命名。會創建copy而不是更改本尊,如果想直接改本尊請帶上inplace=True參數。還可以在參數中更改特定的index,如
data.rename(index={OHIO: INDIANA},columns={three: peekaboo})
在實際練習中遇到疑難會再補充
推薦閱讀:
※Python利器之胎教《唐詩三百首》文本分析
※Flask源碼閱讀筆記(四)
※Python3《機器學習實戰》學習筆記(九):支持向量機實戰篇之再撕非線性SVM
※anaconda
※深入描述符