pandas是創建在Numpy基礎上的高效數據分析處理庫,是Python的重要數據分析庫。
pandas提供了衆多的高級函數,極大地簡化了數據處理的流程,尤爲是被普遍地應用於金融領域的數據分析。python
import pandas as pd from pandas import Series,DataFrame import numpy as np
Series是一種相似與一維數組的對象,由下面兩個部分組成:數組
values:一組數據(ndarray類型)數據結構
index:相關的數據索引標籤app
兩種建立方式:dom
(1) 由列表或numpy數組建立ide
默認索引爲0到N-1的整數型索引函數
#使用列表建立 Series是序列 Series(data=[1,2,3,4,5,6]) #結果 0 1 1 2 2 3 3 4 4 5 5 6 dtype: int64
#經過numpy建立Series Series(data=np.random.randint(1,40,size=(5,)),index=['a','d','f','g','t'],name='bobo')
(2) 由字典建立:不能在使用index.可是依然存在默認索引ui
注意:數據源必須爲一維數據spa
dic = { '語文':150, '數學':150, '英語':150, '理綜':150 } s = Series(data=dic) #查看時 s
可使用中括號取單個索引(此時返回的是元素類型),或者中括號裏一個列表取多個索引(此時返回的是一個Series類型)。設計
(1) 顯式索引:
- 使用index中的元素做爲索引值 - 使用s.loc[](推薦):注意,loc中括號中放置的必定是顯示索引
注意,此時是閉區間
(2) 隱式索引:
- 使用整數做爲索引值 - 使用.iloc[](推薦):iloc中的中括號中必須放置隱式索引
注意,此時是半開區間
列如:
能夠把Series當作一個定長的有序字典
向Series增長一行:至關於給字典增長一組鍵值對
能夠經過shape,size,index,values等獲得series的屬性
可使用s.head(),tail()分別查看前n個和後n個值
對Series元素進行去重(使用unique)
兩個Series進行相加
可使用pd.isnull(),pd.notnull(),或s.isnull(),notnull()函數檢測缺失數據
(1) + - * /
(2) add() sub() mul() div() : s1.add(s2,fill_value=0)
(3) Series之間的運算
DataFrame是一個【表格型】的數據結構。DataFrame由按必定順序排列的多列數據組成。設計初衷是將Series的使用場景從一維拓展到多維。DataFrame既有行索引,也有列索引。
最經常使用的方法是傳遞一個字典來建立。DataFrame以字典的鍵做爲每一【列】的名稱,以字典的值(一個數組)做爲每一列。
此外,DataFrame會自動加上每一行的索引。
使用字典建立的DataFrame後,則columns參數將不可被使用。
同Series同樣,若傳入的列與字典的鍵不匹配,則相應的值爲NaN。
使用ndarray建立DataFrame:建立一個表格用於展現張三,李四,語文,數學,英語的成績
dic = { '張三':[77,88,99], '李四':[67,68,69] } df = DataFrame(data=dic,index=['語文','數學','英語']) df
DataFrame屬性:values、columns、index、shape
- 經過相似字典的方式 df['q'] - 經過屬性的方式 df.q
能夠將DataFrame的列獲取爲一個Series。返回的Series擁有原DataFrame相同的索引,且name屬性也已經設置好了,就是相應的列名。
#修改列索引 df.columns = ['zhangsan','lisi'] df
- 使用.loc[]加index來進行行索引 - 使用.iloc[]加整數來進行行索引
一樣返回一個Series,index爲原來的columns。
- 使用列索引 - 使用行索引(iloc[3,1] or loc['C','q']) 行索引在前,列索引在後
【注意】 直接用中括號時:
(1) DataFrame之間的運算
同Series同樣:
有兩種丟失數據:
None是Python自帶的,其類型爲python object。所以,None不能參與到任何計算中。
np.nan是浮點類型,能參與到計算中。但計算的結果老是NaN。
#建立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.nan
isnull()
notnull()
dropna()
: 過濾丟失數據
fillna()
: 填充丟失數據
#一行中要是都有值 也就是 不是空的爲True #一行 中只要有一個爲none 爲空則爲False df.notnull().all(axis=1) #1表明行 notnull(all) isnull(any) df.loc[df.notnull().all(axis=1)] #去掉行有值爲空的行
df.dropna() 能夠選擇過濾的是行仍是列(默認爲行):axis中0表示行,1表示的列
df.dropna(axis=0) #刪除一行中有空值的行
fillna()
:value和method參數
能夠選擇前向填充仍是後向填充
df.fillna(method='ffill',axis=1) #向前填充 就是根據前條數據來填充空數據
method 控制填充的方式 bfill(向後填充) ffill(向前填充)
最多見的方法是給DataFrame構造函數的index或者columns參數傳遞兩個或更多的數組
import numpy as np import pandas as pd from pandas import Series,DataFrame col=pd.MultiIndex.from_product([['qizhong','qimo'], ['chinese','math']]) #建立DF對象 df = DataFrame(data=np.random.randint(60,120,size=(2,4)),index=['tom','jay'], columns=col) df
pandas的拼接分爲兩種:
pandas使用pd.concat函數,與np.concatenate函數相似,只是多了一些參數: objs axis=0 keys join='outer' / 'inner':表示的是級聯的方式,outer會將全部的項進行級聯(忽略匹配和不匹配),而inner只會將匹配的項級聯到一塊兒,不匹配的不級聯 ignore_index=False
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種鏈接方式:
外鏈接:補NaN(默認模式)
內鏈接:只鏈接匹配的項
因爲在後面級聯的使用很是廣泛,所以有一個函數append專門用於在後面添加
merge與concat的區別在於,merge須要依據某一共同的列來進行合併
使用pd.merge()合併時,會自動根據二者相同column名稱的那一列,做爲key來進行合併。
注意每一列元素的順序不要求一致
參數:
how:out取並集 inner取交集
on:當有多列相同的時候,可使用on來指定使用那一列進行合併,on的值爲一個列表
將df1與df2合併
df1 = DataFrame({'employee':['Bob','Jake','Lisa'], 'group':['Accounting','Engineering','Engineering'], }) df1 df2 = DataFrame({'employee':['Lisa','Bob','Jake'], 'hire_date':[2004,2008,2012], }) df2 pd.merge(df1,df2,how='outer')
df3 = DataFrame({ 'employee':['Lisa','Jake'], 'group':['Accounting','Engineering'], 'hire_date':[2004,2016]}) df3 df4 = DataFrame({'group':['Accounting','Engineering','Engineering'], 'supervisor':['Carly','Guido','Steve'] }) df4 pd.merge(df3,df4,how='outer')
df5 = DataFrame({'employee':['Bob','Jake','Lisa'], 'group':['Accounting','Engineering','Engineering']}) df5 df6 = DataFrame({'group':['Engineering','Engineering','HR'], 'supervisor':['Carly','Guido','Steve'] }) df6 pd.merge(df5,df6,how='outer')
df1 = DataFrame({'employee':['Jack',"Summer","Steve"], 'group':['Accounting','Finance','Marketing']}) df2 = DataFrame({'employee':['Jack','Bob',"Jake"], 'hire_date':[2003,2009,2012], 'group':['Accounting','sell','ceo']})
內合併:只保留二者都有的key(默認模式)
外合併 how='outer':補NaN
-可以繪製出高質量的圖形,而且圖形裏面的鑲嵌的文本必需足夠美觀
-可以和Tex文檔一塊兒輸出
-可以嵌入到GUI(圖形用戶界面)應用程序中
Matplotlib中的基本圖表包括的元素
x軸和y軸 axis
水平和垂直的軸線
x軸和y軸刻度 tick
刻度標示座標軸的分隔,包括最小刻度和最大刻度
x軸和y軸刻度標籤 tick label
表示特定座標軸的值
繪圖區域(座標系) axes
實際繪圖的區域
座標系標題 title
實際繪圖的區域
軸標籤 xlabel ylabel
實際繪圖的區域
import matplotlib.pyplot as plt
簡單的列子:
x=[1,2,3,4,5] y=[2,4,6,8,10] plt.plot(x,y)
繪製拋物線
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)
一、連續調用屢次plot函數
plt.plot(x,y) plt.plot(x+2,y+3)
二、也能夠在一個plot函數中傳入多對X,Y值,在一個圖中繪製多個曲線
plt.plot(x,y,x+1,y-2)
ax1 = plt.subplot(221) ax1.plot(x,y) ax2 = plt.subplot(2,2,2) ax2.plot(x,y) ax3 = plt.subplot(2,2,3) ax3.plot(x,y) ax4 = plt.subplot(2,2,4) ax4.plot(x,y)
參數:
- axis - color:支持十六進制顏色 - linestyle: -- -. : - alpha
plt.plot(x,y) plt.grid(axis='both',c='blue')
繪製一個正弦曲線圖,並設置網格
plt.plot(x,y,c='red',alpha=0.7)
plt.axis([xmin,xmax,ymin,ymax])
plt.plot(x,y) plt.axis([-6,6,-2,2]) #plt.axis('off') plt.axis('off') 關閉座標軸