數據分析的python基底(3)——array、Series、DataFrame筆記

數據分析的python基底(3)——array、Series、DataFrame筆記

來自專欄 猴子聊數據分析

《利用python進行數據分析》的第4、5章介紹了兩個非常重要的包,NumPy和Pandas,這篇文章是我看這兩章做的筆記,只列了要點和我覺得要留意的地方。

電子書和配套代碼,還有一些學習資源,猴子在這裡都提供拉:

猴子:如何學習《利用python進行數據分析》這本書??

zhuanlan.zhihu.com圖標

(我看的是英文新版,針對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)),標準正態分布
  1. array最重要的特徵是「向量化」,等長的array間能進行數學運算。
  2. array的切片和list不同,array的切片不是copy,而是映射view,提取切片修改它的數值原始的array也會被修改!要想複製可用arr[5:8].copy()。切片里可以直接用判斷語句,如data[data < 0]
  3. 一個神奇的功能:可以用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)

  1. 對Series使用函數,作用的是Series的copy,要賦值後才會改變Series本尊,比如s.reindex([b,a,d,c])修改下標,s本身不會變,要s=s.reindex([b,a,d,c])才行。
  2. 常用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
深入描述符

TAG:數據分析 | Python |