Numpy,Pandas,Matplotlib

一 . numpy

-- 數據分析:就是把一些看似雜亂無章的數據信息提煉出來,總結出所研究的內在規律 -- 數據分析三劍客:Numpy,Pandas,Matplotlib -- Numpy(Numerical Python)是python語言的一個擴展程序庫,支持大量的緯度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫.

  1. 建立ndarray

import numpy # 一維數組的建立 array1 = numpy.array([1,2,3]) # 二維數組的建立(一般用的是二維) array2 = numpy.array([[1,'two',3],[4,5,6]]) !!! 注意: numpy默認裏面的全部元素類型都是相同的,全是數字,全是字母等 若是傳進來的列表中數據類型不統一,則統一爲同一類型,優先級:str>float>int

    1.1 使用matplotlib.pyplot獲取一個numpy數組,數據來源一張圖片python

import matplotlib.pyplot as plt img_array = plt.imread('./sjl.jpg') plt.imshow(img_array) # 顯示圖片  操做numpy數據同步到圖片中(修圖底層就是這麼實現的) img_array = img_array - 50 plt.imshow(img_array) img_array.shape # 獲得(396, 406, 3), 前兩個參數是像素,第三個是顏色,上面直接-50,是把這三個數都減了50 

    1.2 numpy的一些用法(下面就默認已經導入了numpy啦)數組

numpy.full(shape=(5,6),fill_value=66) # 返回5行6列,值爲66的數組  numpy.linspace(0,100,num=10) # 得到等差數列  numpy.arange(0,10,2) # 從0-9,步長是2  numpy.random.randint(0,50,size=(3,3)) #0-50的隨機數組成3x3的矩陣 # 固定隨機性(隨機因子) numpy.random.seed(5) # 系統指定的當前時間戳,指定以後就不變了,怎麼隨機都是這些數 numpy.random.randint(0,50,size=(3,3))

  2. ndarry的屬性

四個必須記住的參數: ndim(緯度) shape(形狀,各維度的長度) size(總長度) dtype(元素類型) 應用: (img_array仍是上面那個圖片) img_array.ndim # 3  img_array.size # 482328  img_array.dtype # dtype('uint8')  type(img_array) # numpy.ndarray

  3. ndarray的基本操做

    3.1 索引  (一維與列表同樣,多維同理)數據結構

array2 = numpy.array([[1,'two',3],[4,5,6]]) array2[0][1] # two

    3.2 切片 (一維與列表同樣,多維同理)dom

numpy.random.seed(1) array3 = numpy.random.randint(0,100,size=(4,4)) array3[0:2] # 獲取二維數組的前兩行 # 獲取二數組的前兩列 array3[:,0:2] # 一個逗號用作二維數組,逗號前邊是行,不要行數據的話用冒號表示  array3[0:2,0:2] # 獲取前兩行中的前兩列  array3[::-1] # 將二維數組的 行 進行倒序  array3[:,::-1] # 列倒序  array3[::-1,::-1] # 所有都倒序 # 這裏能夠應用到圖片旋轉上(仍是上面那個圖片) # img_array[row,col,color] plt.imshow(img_array[:,::-1,:]) plt.imshow(img_array[::-1,::-1,::-1])

  3. 變形

# 將一維數組變成多維 array2 = [['1', 'two', '3'],['4', '5', '6']] array2 .reshape((2,3)) # 改爲2行,每行3個數據,正好6個 參數必定要是tuple # 將多維數組變成一維 arr = [['1', 'two', '3'], ['4', '5', '6']] arr = arr .reshape((6)) # array2這個二維數組一共有6個數,也就是說,裏面的tuple參數必定要是 6  # 自動計算,用-1,前提必須其餘的數都是已知數 arr.reshape((-1,2)) # 固定參數是2列,自動計算出3行

  4. 級聯

numpy.concatenate() 一維,二維,多維數組的級聯,實際操做中多數是二維數組 # 先建3個數組 np.random.seed(5) a1 = numpy.random.randint(0,50,size=(4,4)) a2 = numpy.random.randint(0,50,size=(4,4)) a3 = numpy.random.randint(0,50,size=(3,4)) display(a1,a2,a3) numpy.concatenate((a1,a2),axis=0) # 二維數組axis只能是0或者1, 0表明列拼在一塊兒,1表明行拼在一塊兒  九宮格照片 img_array = plt.imread('./sjl.jpg') img_3 = np.concatenate((img_array,img_array,img_array),axis=0) img_9 = np.concatenate((img_3,img_3,img_3),axis=1) plt.imshow(img_9)

  

  5. 切分

與級聯相似,三個函數完成切分工做: numpy.split(array,行號/列號,軸),參數2是一個列表類型 numpy.vsplit numpy.nsplit a1 = np.random.randint(0,50,size=(4,4)) np.split(a1,[2],axis=0) # 切的是列(就是橫着切) # 裁剪圖片,用切片方法 # img_array[row,col,color] plt.imshow(img_array[20:280,100:300,])

  6.ndarry聚合操做

a1 = np.random.randint(0,50,size=(4,4)) a1.sum(axis=0) # axis=0,就列的和,axis=1,求行的和,不寫參數,求全部數的和  最大值最小值:np.max/np.min 同理 平均值:np.mean() 同理

  7. numpy.array的排序

np.sort()nd.array.sort() 均可以,但有區別: np.sort()不改變原數組 經常使用這個,由於不要輕易改變數據 ndarray.sory()本地處理,但不佔用空間,但改變原數組

二 . Pandas

  先導入包,下面全部的代碼就直接用了,不在導包了

import pandas as pd import numpy as np from pandas import Series,DataFrame

  Series

Series是一種相似於一維數組的對象,由下面兩個部分組成: values:一組數據(ndarray類型) index:相關的數據索引標籤

  Series的建立

三種建立方式: 1.列表建立 2.numpy數組建立
3.字典建立
默認索引爲0到n
-1的整數索引

  Series的一些操做

# 使用列表建立Series 隱式索引(就是索引是下標0,1,2,3) s1 = Series(data=[1,2,3,4]) # s1[0] 取到的是1 # 使用列表建立Series 顯示索引,(使用顯示索引,也可使用隱式索引) s2 = Series(data=[1,2,3,4],index=['a','b','c','d']) # s2[0]和s2['a'] 取到的都是1 ================================================ # 使用numpy建立Series s3 = Series(data=np.random.randint(0,20,size=(5,))) dic = { 'English':100, 'math':30 } Series(data=dic) 取索引的方法還有: s2.loc['a'] #必定要拿顯示索引 s2.iloc[1] # 必定要拿隱式索引 s2['xxx'] = 666 # 添加

  能夠經過shape,size,index,values等拿到series的屬性

s2.shape # (5,) s2.size # 5 s2.index # 只能拿到顯示索引 Index(['a', 'b', 'c', 'd', 'xxx'], dtype='object') s2.values # array([ 1, 2, 3, 4, 666], dtype=int64)  head()與tail() 是查看前/後多少個元素 s2.head(2) # 查看前兩個

  對series去重與數據清洗

去重 s = Series(data=[1,1,1,1,2,2,2,2,3,3,3,4,4]) s.unique() # array([1, 2, 3, 4], dtype=int64)  數據清洗 s3 = Series(data=[1,2,3,4],index=['a','b','c','d']) s4 = Series(data=[1,2,3,4],index=['a','b','c','x']) s = s3 + s4 print(s) # 發現d和x都是NaN  a 2.0 b 4.0 c 6.0 d NaN x NaN s.isnull() s.notnull() a True b True c True d False x False dtype: bool s[s.notnull()]

  DataFrame

DataFrame是一個 表格型 的數據結構.DataFrame由按必定順序排列的多列數據組成,設計初衷是將Series使用場景從一維拓展到多維,DateFrame既有行索引,又有列索引. - 行索引: index - 列索引: columns - 值: values

  DataFrame的建立

最經常使用的方法是傳遞一個字典來建立,DateFrame以字典的鍵做爲每一列的名稱,以字典的值(一個數組)做爲每一列. 此外,DataFrame會自動加上每一行的索引. 使用字典建立DataFrame後,columns參數則不可用. 同Series同樣,若傳入的類與字典的鍵不匹配,則相應的值爲NaN.
df = DataFrame(data=np.random.randint(1,10,size=(3,3)),index=['a','b','c'],columns=['A','B','C']) df.values array([[1, 6, 5], [1, 8, 4], [7, 3, 1]])

  使用字典建立DataFrame

dic = { '張三':[150,150,150,150], '李四':[0,0,0,0] } df = DataFrame(data=dic,index=['語文','數學','英語','理綜']) 張三 李四 語文 150 0 數學 150 0 英語 150 0 理綜 150 0

  DateFrame的索引

對列進行索引: - 經過相似字典的方式 df['key'] - 經過屬性的方式 df.key 能夠將DataFrame的列獲取爲一個Series.返回的Series擁有相同的索引,且name屬性也已經設置好了,就是相應的列名 # 修改列索引 df.columns = ['王五','趙六'] # 獲取列數據,用[]去只能去列而且只能是顯示索引 df['王五'] df[['趙六','王五']] df.loc['語文'] 對行進行索引 - 使用loc[] 裏面寫顯示索引 - 使用iloc[] 裏面寫隱性索引 df.iloc[0] 取出肯定位置的數據 df.loc[row,col] df.loc['理綜','王五'] # 王五的語文與數學成績 df.loc[['語文','數學'],'王五'] # 可用loc或iloc中取列 df.iloc[:,0]

  切片

!!!注意->直接用中括號時: - 索引表示的是列索引 - 切片表示的行索引

  實操

# 切前2行數據 df[0:2] # 切前2列 df.iloc[:,0:2] # 經過索引切片,能夠直接寫顯示索引 df.loc['語文':'數學']

  運算

first_exam = df last_exam = df # 求first_exam與last_exam的平均成績 (first_exam+last_exam)/2 # 王五的first_exam語文成績取消,爲0 first_exam.loc['語文','王五'] = 0 # 趙六的全部first_exam成績加100 first_exam['趙六']=first_exam['趙六'] + 100

   pandas數據處理

# 刪除重複元素 使用duplicated()函數檢測重複的行,返回元素爲布爾類型的Series對象,每一個元素對應一行,若是該行不是第一次出現,則元素爲True keep參數:指定保留哪個重複的行數據

  建立具備重複元素行DataFrame

# 建立一個df df = DataFrame(data=numpy.random.randint(0,100,size=(8,4))) df.iloc[1] = [666,666,666,666] df.iloc[3] = [666,666,666,666] df.iloc[6] = [666,666,666,666]

  

   使用duplicated()函數檢測重複的行

~df.duplicated(keep='first') # False對應的重複的值,注意前面取反了,first保留第一行,last最後一行,False全不要 df.loc[~df.duplicated(keep='first')]

  

  使用df.drop_duplicates(keep='first/last'/False)刪除重複的行

df.drop_duplicates(keep='first')
相關文章
相關標籤/搜索