Python爬虫数据分析三剑客:Numpy、pandas、Matplotlib
一、 pandas
pandas簡介
pandas是建立在Numpy基礎上的高效數據分析處理庫,是Python的重要數據分析庫。
pandas提供了眾多的高級函數,極大地簡化了數據處理的流程,尤其是被廣泛地應用于金融領域的數據分析。
pandas主要包括的是:
- 帶有標簽的數據結構,主要包括序列(Series)和數據框(DataFrame)等
- 允許簡單索引和多級索引
- 支持從Excel、CSV等文本格式中文導入數據,以Pytables/HDF5格式高效地讀/寫數據。
- 整合了對數據集的集合和轉換功能
- 生成特定類型的數據
pandas的導入:
import pandas as pd from pandas import Series,DataFrame import numpy as nppandas中的Series
Series是一種類似與一維數組的對象,由下面兩個部分組成:
- values:一組數據(ndarray類型)
- index:相關的數據索引標簽
1)Series的創建
兩種創建方式:
(1) 由列表或numpy數組創建
默認索引為0到N-1的整數型索引
- 還可以通過設置index參數指定索引
(2) 由字典創建:不能在使用index.但是依然存在默認索引
注意:數據源必須為一維數據
dic = {'語文':150,'數學':150,'英語':150,'理綜':150 } s = Series(data=dic)#查看時s2)Series的索引和切片
可以使用中括號取單個索引(此時返回的是元素類型),或者中括號里一個列表取多個索引(此時返回的是一個Series類型)。
(1) 顯式索引:
- 使用index中的元素作為索引值 - 使用s.loc[](推薦):注意,loc中括號中放置的一定是顯示索引注意,此時是閉區間
(2) 隱式索引:
- 使用整數作為索引值 - 使用.iloc[](推薦):iloc中的中括號中必須放置隱式索引注意,此時是半開區間
列如:
切片:隱式索引切片和顯示索引切片
- 顯示索引切片:index和loc
- 隱式索引切片:整數索引值和iloc
3)Series的基本概念
可以把Series看成一個定長的有序字典
向Series增加一行:相當于給字典增加一組鍵值對
可以通過shape,size,index,values等得到series的屬性
可以使用s.head(),tail()分別查看前n個和后n個值
對Series元素進行去重(使用unique)
兩個Series進行相加
- 當索引沒有對應的值時,可能出現缺失數據顯示NaN(not a number)的情況
- 使得兩個Series進行相加:索引與之對應的元素會進行算數運算,不對應的就補空
可以使用pd.isnull(),pd.notnull(),或s.isnull(),notnull()函數檢測缺失數據
4)Series的運算
(1) + - * /
(2) add() sub() mul() div() : s1.add(s2,fill_value=0)
(3) Series之間的運算
- 在運算中自動對齊不同索引的數據
- 如果索引不對應,則補NaN
pandas中的DataFrame
DataFrame是一個【表格型】的數據結構。DataFrame由按一定順序排列的多列數據組成。設計初衷是將Series的使用場景從一維拓展到多維。DataFrame既有行索引,也有列索引。
- 行索引:index
- 列索引:columns
- 值:values
1)DataFrame的創建
最常用的方法是傳遞一個字典來創建。DataFrame以字典的鍵作為每一【列】的名稱,以字典的值(一個數組)作為每一列。
此外,DataFrame會自動加上每一行的索引。
使用字典創建的DataFrame后,則columns參數將不可被使用。
同Series一樣,若傳入的列與字典的鍵不匹配,則相應的值為NaN。
DataFrame的創建方式:
-
使用ndarray創建DataFrame
-
使用ndarray創建DataFrame:創建一個表格用于展示張三,李四,語文,數學,英語的成績
DataFrame屬性:values、columns、index、shape
2)DataFrame的索引
(1) 對列進行索引
- 通過類似字典的方式 df['q'] - 通過屬性的方式 df.q可以將DataFrame的列獲取為一個Series。返回的Series擁有原DataFrame相同的索引,且name屬性也已經設置好了,就是相應的列名。
修改索引
#修改列索引 df.columns = ['zhangsan','lisi'] df(2) 對行進行索引
- 使用.loc[]加index來進行行索引 - 使用.iloc[]加整數來進行行索引同樣返回一個Series,index為原來的columns。
(3) 對元素索引的方法
- 使用列索引 - 使用行索引(iloc[3,1] or loc['C','q']) 行索引在前,列索引在后切片:
【注意】 直接用中括號時:
- 索引表示的是列索引
- 切片表示的是行切片
3)DataFrame的運算
(1) DataFrame之間的運算
同Series一樣:
- 在運算中自動對齊不同索引的數據
- 如果索引不對應,則補NaN
處理丟失數據
有兩種丟失數據:
- None
- np.nan(NaN)
1. None
None是Python自帶的,其類型為python object。因此,None不能參與到任何計算中。
2. np.nan(NaN)
np.nan是浮點類型,能參與到計算中。但計算的結果總是NaN。
3. pandas中的None與NaN
1) pandas中None與np.nan都視作np.nan
'''遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書!''' #創建DataFrame df = DataFrame(data=np.random.randint(10,50,size=(8,8))) df df.iloc[1,3]=None df.iloc[2,2]=None df.iloc[4,2]=None df.iloc[6,7]=np.nan2) pandas處理空值操作
-
isnull()
-
notnull()
-
dropna(): 過濾丟失數據
-
fillna(): 填充丟失數據
df.dropna() 可以選擇過濾的是行還是列(默認為行):axis中0表示行,1表示的列
df.dropna(axis=0) #刪除一行中有空值的行3) 填充函數 Series/DataFrame
-
fillna():value和method參數
可以選擇前向填充還是后向填充
method 控制填充的方式 bfill(向后填充) ffill(向前填充)
1. 創建多層列索引
1) 隱式構造
最常見的方法是給DataFrame構造函數的index或者columns參數傳遞兩個或更多的數組
2) 顯示構造pd.MultiIndex.from_
- 使用數組
- 使用product
二 pandas的拼接操作
pandas的拼接分為兩種:
- 級聯:pd.concat, pd.append
- 合并:pd.merge, pd.join
1. 使用pd.concat()級聯
pandas使用pd.concat函數,與np.concatenate函數類似,只是多了一些參數:objs axis=0 keys join='outer' / 'inner':表示的是級聯的方式,outer會將所有的項進行級聯(忽略匹配和不匹配),而inner只會將匹配的項級聯到一起,不匹配的不級聯 ignore_index=False1)匹配級聯
df1 = DataFrame(data=np.random.randint(0,100,size=(3,3)),index=['a','b','c'],columns=['A','B','C']) df2 = DataFrame(data=np.random.randint(0,100,size=(3,3)),index=['a','d','c'],columns=['A','d','C']) pd.concat((df1,df1),axis=0,join='inner')2) 不匹配級聯
不匹配指的是級聯的維度的索引不一致。例如縱向級聯時列索引不一致,橫向級聯時行索引不一致
有2種連接方式:
- 外連接:補NaN(默認模式)
- 內連接:只連接匹配的項
3) 使用df.append()函數添加
由于在后面級聯的使用非常普遍,因此有一個函數append專門用于在后面添加
2. 使用pd.merge()合并
merge與concat的區別在于,merge需要依據某一共同的列來進行合并
使用pd.merge()合并時,會自動根據兩者相同column名稱的那一列,作為key來進行合并。
注意每一列元素的順序不要求一致
參數:
- how:out取并集 inner取交集
- on:當有多列相同的時候,可以使用on來指定使用那一列進行合并,on的值為一個列表
1) 一對一合并
將df1與df2合并
df1 = DataFrame({'employee':['Bob','Jake','Lisa'],'group':['Accounting','Engineering','Engineering'],}) df1df2 = DataFrame({'employee':['Lisa','Bob','Jake'],'hire_date':[2004,2008,2012],}) df2pd.merge(df1,df2,how='outer')2) 多對一合并
df3 = DataFrame({'employee':['Lisa','Jake'],'group':['Accounting','Engineering'],'hire_date':[2004,2016]}) df3df4 = DataFrame({'group':['Accounting','Engineering','Engineering'],'supervisor':['Carly','Guido','Steve']}) df4pd.merge(df3,df4,how='outer')3)多對多合并
df5 = DataFrame({'employee':['Bob','Jake','Lisa'],'group':['Accounting','Engineering','Engineering']}) df5df6 = DataFrame({'group':['Engineering','Engineering','HR'],'supervisor':['Carly','Guido','Steve']}) df6 pd.merge(df5,df6,how='outer')4) key的規范化
- 當列沖突時,即有多個列名稱相同時,需要使用on=來指定哪一個列作為key,配合suffixes指定沖突列名
- 當兩張表沒有可進行連接的列時,可使用left_on和right_on手動指定merge中左右兩邊的哪一列列作為連接的列
5) 內合并與外合并:out取并集 inner取交集
- 內合并:只保留兩者都有的key(默認模式)
- 外合并 how=‘outer’:補NaN
三 Matplotlib
Matplotlib是一個主要用于繪制二維圖形的Python庫
-能夠繪制出高質量的圖形,并且圖形里面的鑲嵌的文本必需足夠美觀
-能夠和Tex文檔一起輸出
-能夠嵌入到GUI(圖形用戶界面)應用程序中
Matplotlib中的基本圖表包括的元素
- x軸和y軸 axis
水平和垂直的軸線 - x軸和y軸刻度 tick
刻度標示坐標軸的分隔,包括最小刻度和最大刻度 - x軸和y軸刻度標簽 tick label
表示特定坐標軸的值 - 繪圖區域(坐標系) axes
實際繪圖的區域 - 坐標系標題 title
實際繪圖的區域 - 軸標簽 xlabel ylabel
實際繪圖的區域
matplotlib的導入:
import matplotlib.pyplot as plt包含單條曲線的圖
- 注意:y,x軸的值必須為數字
簡單的列子:
x=[1,2,3,4,5] y=[2,4,6,8,10] plt.plot(x,y)[外鏈圖片轉存失敗(img-zZwBHmc5-1566546593187)(file:///C:/Users/MLH/AppData/Roaming/Typora/typora-user-images/1551965523571.png)]
-
繪制拋物線
x = np.linspace(-np.pi,np.pi,num=20) y = x**2 plt.plot(x,y) -
繪制正弦曲線圖
x y = np.sin(x) plt.plot(x,y)
包含多個曲線的圖
1、連續調用多次plot函數
plt.plot(x,y) plt.plot(x+2,y+3)2、也可以在一個plot函數中傳入多對X,Y值,在一個圖中繪制多個曲線
plt.plot(x,y,x+1,y-2)將多個曲線圖繪制在一個table區域中:對象形式創建表圖
- a=plt.subplot(row,col,loc) 創建曲線圖
- a.plot(x,y) 繪制曲線圖
網格線 plt.gride(XXX)
參數:
- axis - color:支持十六進制顏色 - linestyle: -- -. : - alpha plt.plot(x,y) plt.grid(axis='both',c='blue')繪制一個正弦曲線圖,并設置網格
plt.plot(x,y,c='red',alpha=0.7)坐標軸界限
axis方法:設置x,y軸刻度值的范圍
plt.axis([xmin,xmax,ymin,ymax])
plt.plot(x,y) plt.axis([-6,6,-2,2]) #plt.axis('off') plt.axis('off') 關閉坐標軸總結
以上是生活随笔為你收集整理的Python爬虫数据分析三剑客:Numpy、pandas、Matplotlib的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 输出所有大小写字母, ra
- 下一篇: python爬虫Scrapy框架之增量式