掌握表示、清洗、統計和展示數據的能力
包括 numpy庫 ndarray
Matplotlib庫 pyplot
Pandas庫 Series DataFrame類型
編程工具:
使用anacode IDE集成開發環境
需要理解和掌握如下工具的使用: conda, spyder, IPython
本課程的實例:
實例1:圖像的手繪效果
實例2:引力波的繪制
實例3:房價趨勢的關聯因素分析
實例4:股票數據的趨勢分析曲線
坐標系的繪制
餅圖的繪制
直方圖的繪制
極坐標圖的繪制
散點圖的繪制
2. Anaconda IDE的基本使用
開源免費
支持近800個第三方庫
包含多個主流工具
適合數據計算領域開發
win/linux/OS X
包管理和環境管理工具 conda
conda: 一個工具,用於包管理和環境管理 ,其中:
包管理與pip類似,管理python的第三方庫
環境管理能夠允許用戶使用不同版本python,並能靈活切換
anaconda:一個集合,包括conda,某版本的python,一批第三方庫
conda將工具,第三方庫,Python版本,conda都當作包,同等對待
win平台 cmd 執行 conda --version 獲取conda版本
執行 conda update conda升級 conda
編程工具spyder
交互式編程環境 IPython: 是一個功能強大的交互式shell 適合用於進行交互式的數據可視化和GUI的相關應用
變量前或后增加?將顯示一些通用信息和包括函數對應的源代碼
%run demo.py用於運行一個py程序
IPython的%魔術命令
常用命令 | 說明 |
%magic | 顯示所有的魔術命令 |
%hist | IPython命令的輸入歷史 |
%pdb | 異常發生后自動進行調試器 |
%reset | 刪除當前命令空間中的全部變量或名稱 |
%who | 顯示IPython當前命令空間中已經定義的變量 |
%time statement | 給出代碼的執行時間,statement表示一段代碼 |
%timeit statement | 多次執行代碼,計算綜合平均執行時間 |
3. numpy庫入門
數據的維度
維度:一組數據的組織形式
一維數據:由對待關系的有序或無序數據構成,采用線性方式組織 數組,對應列表,數組和集合的概念
二維數據:由多個一維數據組成,是一維數據的組合形式列表:數據類型可以不同數組:數據類型相同
多維數據:由一維或二維數據在新的維度上的擴展形成的
高維數據:僅利用最基本的二元關系展示數據間的復雜結構
數據維度的python表示
數據維度是數據的組織形式
一維數據: 列表和集合類型 列表有序 集合無序
二維數據:列表類型
多維數據:列表類型
高維數據:字典類型或或JSON,XML和YAML格式
numpy的數據對象ndarray
numpy是一個開源的python科學計算基礎庫,包含:
- 一個強大的N維數組對象 ndarray
- 廣播功能函數
- 整合C/C++/Fortran代碼的工具
- 線性代數、傅立葉變換、隨機數生成等功能
numpy是Scipy,Pandas等數據處理或科學計算庫的基礎
numpy庫的引用 import numpy as np
ndarray和python自帶列表的區別,如下面的例子所示
import numpy as np
def npSum():
a = np.array([0,1,2,3,4,5])
b = np.array([9,8,7,6,5,4])
c = a**2 + b**3
return c
def pySum():
a = [0,1,2,3,4,5]
b = [9,8,7,6,5,4]
c = []
for i in range(len(a)):
c.append(a[i]**2 + b[i]**3)
return c
print(npSum())
print(pySum())
輸出
[729 513 347 225 141 89]
[729, 513, 347, 225, 141, 89]
numpy中ndarray的優點:
- ndarray對象可以去掉元素間運算所需的循環,便一維向量更像單個數據
- 設置專門的數組對象,經過優化,可以提升這類應用的運算速度
- 數組對象采用相同的數據類型,有助於節省運算和存儲空間
- 實際的數據
- 描述這些數據的元數據(數據維度、數據類型等)
ndarray實例
>>> a = np.array([[0,1,2,3,4],[9,8,7,6,5]]) # np.array()生成一個ndarray數組
>>> a
array([[0, 1, 2, 3, 4],
[9, 8, 7, 6, 5]])
>>> print(a)#ndarray()輸出成[]形式,元素由空格分割
[[0 1 2 3 4]
[9 8 7 6 5]]
軸:保存數據的維度
秩:軸的數量
ndarray對象的屬性
屬性 | 說明 |
.ndim | 秩,即軸的數量或維度的數量 |
.shape | ndarray對象尺度,對於 矩陣,n行m列 |
.size | ndarray對象元素的個數,相當於.shape中的n*m的值 |
.dtype | ndarray對象的元素類型 |
.itemsize | ndarray對象中每個元素的大小,以字節為單位 |
>>> a.ndim
2
>>> a.shape
(2, 5)
>>> a.size
10
>>> a.dtype
dtype('int32')
>>> a.itemsize
4
ndarray數組的元素類型
數據類型 | 說明 |
bool | 布爾類型,True或False |
intc | 與C語言中int類型一致,一般是int32或int64 |
intp | 用於索引的整數,與C語言中ssize_t一致,int32或int64 |
int8 | 字節長度的整數,取值:[-128,127] |
int16 | 16位長度的整數,取值:[-32768,32767] |
int32 | 32位長度的整數,取值:[-231,231-1] |
int64 | 64位長度的整數,取值:[-263,263-1] |
uint8 | 8位無符號整數,取值:[0,255] |
uint16 | 16位無符號整數,取值:[0,65535] |
uint32 | 32位無符號整數,取值:[0,232-1] |
uint64 | 64位無符號整數,取值:[0,264-1] |
float16 | 16位半精度浮點數 |
float32 | 32位半精度浮點數 |
float64 | 64位半精度浮點數 |
complex64 | 復數類型,實部和虛部都是32位的浮點數 |
complex128 | 復數類型,實部和虛部都是64位的浮點數 |
- 從python的列表、元組等類型創建ndarray數組,如 x = np.array(list/tuple) x = np.array(list/tuple,dytpe = np.float32
- 使用numpy中函數創建ndarray數組,如arange,ones,zeros等
函數 | 說明 |
np.arange(n) | 類似range()函數,返回ndarray類型,元素從0到n-1 |
np.ones(shape) | 根據shape生成一個全1的數組,shape是元組類型 |
np.zeros(shape) | 根據shape生成一個全0數組,shape是元組類型 |
np.full(shape,val) | 根據shape生成一個數組,每個元素都是val |
np.eye(n) | 創建一個正方的n*n單位矩陣,對角線為1,其余為0 |
np.ones_like(a) | 根據數組a的形狀生成一個全1的數組 |
np.zeros_like(a) | 根據數據a的形狀生成一個全0的數據 |
np.full_like(a,val) | 根據數組a的形狀生成一個數組,每個元素都是val |
np.linspace() | 根據起止數據等間距填充數據,形成數組 |
np.concatenate() | 將兩個或多個數組組合成一個新的數組 |
- 從字節流(raw bytes)中創建ndarray數組
- 從文件中讀取特定格式,創建ndarray數組
ndarray數組的變換
方法 | 說明 |
.reshape(shape) | 不改變數組元素,返回一個shape形狀的數組,原數組不變 |
.resize(shape) | 與.shape()功能一致,但修改原數組 |
.swapaxes(ax1,ax2) | 將數組n個維度中兩個維度進行調換 |
.flatten() | 對數組進行降維,返回折疊后的一維數組,原數組不變 |
>>> a = np.array([1,2,3],dtype = np.int)
>>> a.dtype
dtype('int32')
>>> b = a.astype(np.float)
>>> b.dtype
dtype('float64')
ndarray數組向列表的轉換 ls = a.tolist()
>>> c = a.tolist()
>>> c
[1, 2, 3]
ndarray數組的操作
索引和切片:與python的列表類似
ndarray數組的運算
數組與標量之間的運算作用於數組的每一個元素
對ndarray中的數據執行元素級運算的函數
函數 | 說明 |
np.abs() np.fabs() | 計算數組各元素的絕對值 |
np.sqrt() | 計算數組各元素的平方根 |
np.square() | 計算數組各元素的平方 |
np.log(x),np.log10(x),np.log2(x) | 計算數組各元素的自然對數、10底對數和2底對數 |
np.ceil(x),np.floor(x) | 計算數組各元素的ceiling值或floor值 |
np.rint(x) | 計算數組各元素的四舍五入值 |
np.modf(x) | 將數據各元素的整數和小數部分以兩個獨立的數組形式返回 |
np.cos/cosh/sin/sinh/tan/tanh | 計算數據各元素的普通型和雙典型的三角函數 |
np.exp(x) | 計算數組各元素的指數值 |
np.sign(x) | 計算數組各元素的符號值,1(+),0,-1(-) |
函數 | 說明 |
+ - * / ** | 兩個數組對應的元素進行相應的運算 |
np.maximum/minimum/fmax/fmin | 元素級的最大值/最小值 |
np.mod(x,y) | 元素級的模運算 |
np.copysign(x,y) | 將元素y中各元素值的符號賦值給數據x對應的元素 |
> < >= <= == != | 算術比較,產生布爾型的數組 |
numpy數據存取函數
數據的csv文件存取
CSV(Comma-Separated Value,逗號分隔值)是一種常見的文件格式,用來存儲批量數據
np.savetxt(frame,array,fmt='%.18e',delimiter=None)
frame: 文件、字符串或產生器,可以是.gz或.bz2的壓縮文件
array: 存入文件的數組
fmt:寫入文件的格式 ,例如%d %.2f %.18e
delimiter: 分割字符串,默認是空格
如
>>> import numpy as np
>>> a = np.arange(100).reshape(5,20)
>>> np.savetxt('a.csv',a,fmt='%d',delimiter=',')
a.csv文件

np.loadtxt(frame,dtype=np.float,delimiter=None,unpack=False)
frame: 文件、字符串或產生器,可以是.gz或.bz2的壓縮文件
dtype:數據類型,可選
delimiter: 分割字符串,默認是空格
unpack:如果True,讀入屬性將分別寫入不同的變量
csv只能有效存儲一維和二維數組
多維數據的存取
a.tofile(frame,seq=' ',format='%s')
frame:文件,字符串
seq:數據分割字符串,如果是空串,寫入文件為二進制
format:寫入數據的格式
如
>>> a = np.arange(100).reshape(5,20)
>>> a.tofile('a.dat',sep=',',format='%d')

np.fromfile(frame,dtype=float,count=-1,sep=' ')
frame:文件,字符串
dtype:讀取的數據類型
count:讀入元素的個數,-1表示讀入整個文件
seq:數據分割字符串,如果是空串,寫入文件為二進制
numpy的便捷文件讀取
np.save(fname,array)
np.savez(fname,array)
fname:文件名,以.npy為擴展名,壓縮擴展名為.npz
array:數據變量
np.load(fname)
fname:文件名,以.npy為擴展名,壓縮擴展名為.npz
numpy的隨機數函數
np.random.*
函數 | 說明 |
rand(d0,d1,...,dn) | 根據d0-dn創建隨機數數組,浮點數,[0,1),均勻分布 |
randn(d0,d1,...,dn) | 根據d0-dn創建隨機數數組,標准正態分布 |
randint(low[,high,shape]) | 根據shape創建隨機整數或整數數組,范圍是[low,high) |
seed(s) | 隨機數種子,s是給定的種子值 |
shuffle(a) | 根據數組a的第1軸進行隨排列,改變數組a |
permutation(a) | 根據數組a的第1軸產生一個新的亂序數組,不改變數組a |
choice(a[,size,replace,p]) | 從一維數組a中以概率p抽取元素,形成size形狀新數組replace表示是否可能重用元素,默認為False |
uniform(low,high,size) | 產生具有均勻分布的數組,low起始值,high結束值,size為形狀 |
normal(loc,scale,size) | 產生具有正態分布的數組,loc為均值,scale標准差,size為形狀 |
poisson(lam,size) | 產生具有泊松分布的數組,lam為隨機事件發生率,size為形狀 |
numpy的統計函數
注意: axis = None是統計函數的標配參數
函數 | 說明 |
sum(a,axis=None) | 根據給定axis計算數組a相關元素之和,axis整數或元組 |
mean(a,axis=None) | 根據給定axis計算數組a相關元素的期望,axis整數或元組 |
average(a,axis=None,weights=None) | 根據給定axis計算數組a相關元素的加權平均值 |
std(a,axis=None) | 根據給定軸axis計算數組a相關元素的標准差 |
var(a,axis = None) | 根據給定軸axis計算數組a相關元素的方差 |
min(a) max(a) | 計算數組a中元素的最小值,最大值 |
argmin(a) argmax(a) | 計算數組a中元素的最小值,最大值的降一維后下標 |
unravel_index(index,shape) | 根據shape將一維下標index轉換成多維下標 |
ptp(a) | 計算數組a中元素最大值和最小值的差 |
median(a) | 計算數組a中元素的中位數(中值) |
函數 | 說明 |
np.gradient(f) | 計算數組f中元素的梯度,當f為多維時,返回每個維度梯度 |
XY坐標軸連續三個x坐標對應的y軸值:a,b,c,其中b的梯度是(c-a)/2
二、matplotlib庫入門
matplotlib是Python優秀的數據可視化第三方庫
matplotlib庫的效果可參考
http://matplotlib.org/gallery.html
matplotlib的使用 由各種可視化類構成,內部結構復雜,受matlab庫啟發,matplotlab.pyplot是繪制種類可視化圖形的命令子庫,相當於快捷方式
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
plt.plot([2,3,4,5,1,6])
plt.ylabel("Grade")
- plt.savefig('test',dpi=600)#plt.savefig()將輸出圖形存儲為文件,默認為png格式,可以通過dpi修改輸出質量
plt.show()
輸出

plt.plot(x,y)當有兩個以上參數時,按照x軸和y軸順序繪制數據點
import matplotlib.pyplot as plt
plt.plot([0,2,4,6,8,10],[2,3,4,5,1,6])
plt.ylabel("Grade")
plt.axis([-1,11,0,7])
plt.show()
輸出效果

plot.subplot(nrows,ncols,plot_number)
在全局繪制區域中創建一個分區體系,並定位到一個子繪圖區域
pyplot繪圖區域示例
import numpy as np
import matplotlib.pyplot as plt
def f(t):
return np.exp(-t) * np.cos(2*np.pi*t)
a = np.arange(0.0,5.0,0.02)
plt.subplot(211)
plt.plot(a,f(a))
plt.subplot(2,1,2)
plt.plot(a,np.cos(2*np.pi*a),'r--')
plt.show()
輸出

plt.plot(x,y,format_string,**kwargs)
x:x軸數據,列表或數組,可選
y:y軸數據,列表或數組
format_string: 控制曲線的格式字符串,可遷
**kwargs: 第二組或更多的(x,y,format_string)
注意:當繪制多條曲線時,各條曲線的x不能省略
如
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(10)
plt.plot(a,a*1.5,a,a*2.5,a,a*3.5,a,a*4.5)
plt.show()

format_string:由顏色字符、風格字符和標記字符組成
顏色字符 | 說明 | 顏色字符 | 說明 |
'b' | blue | 'm' | magenta洋紅色 |
'g' | green | 'y' | 黃色 |
'r' | red | 'k' | 黑色 |
'c' | cyan青綠色 | 'w' | 白色 |
'#008000' | RGB某顏色 | '0.8' | 灰度值字符串 |
風格字符 | 說明 |
'-' | 實線 |
'--' | 破折線 |
'-.' | 點划線 |
':' | 虛線 |
' ' | 無線條 |
標記字符 | 說明 | 標記字符 | 說明 | 標記字符 | 說明 |
'.' | 點標記 | '1' | 下花三角標記 | 'h' | 豎六邊形標記 |
',' | 像素標記(極小點) | '2' | 上花三角標記 | 'H' | 橫六邊形標記 |
'o' | 實心圏標記 | '3' | 左花三角標記 | '+' | 十字形標記 |
'v' | 倒三角標記 | '4' | 右花三角標記 | 'x' | x標記 |
'^' | 上三角標記 | 's' | 實心方形標記 | 'D' | 菱形標記 |
'>' | 右三角標記 | 'p' | 實心五角標記 | 'd' | 瘦菱形標記 |
'<' | 左三角標記 | '*' | 星形標記 | '|' | 垂直線標記 |
**kwargs: 第二組或更多(x,y,format_string)
color: 控制顏色 如color='green'
linestyle:線條控制 如linestyle='dashed'
marker:標記風格,marker='o'
markerfacecolor:標記顏色,markerfacecolor='blue'
markersize:標記尺寸,markersize=20
...
pyplot的中文顯示
pyplot並不默認支持中文顯示,需要rcParams修改字體實現
import matplotlib
import matplotlib.pyplot as plt
matplotlib.rcParams['font.family']='SimHei'
plt.plot([3,1,4,5,2])
plt.ylabel('縱軸值')
plt.savefig('test',dpi=600)
plt.show()

屬性 | 說明 |
'font.family' | 用於顯示字體的名字 |
'font.style' | 字體風格,正常'normal'或斜體'italic' |
'font.size' | 字體大小,整數字號或者'large','x-small' |
rcParams['font.family']
中文字體 | 說明 |
'SimHei' | 中文黑體 |
'Kaiti' | 中文楷體 |
'LiSu' | 中文隸書 |
'FangSong' | 中文仿宋 |
'YouYuan' | 中文幼圓 |
STSong | 華文宋體 |
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
matplotlib.rcParams['font.family']='STSong'
matplotlib.rcParams['font.size']=20
a = np.arange(0.0,5.0,0.02)
plt.xlabel('縱軸: 振幅')
plt.ylabel('橫軸: 時間')
plt.plot(a,np.cos(2*np.pi*a),'r--')
plt.show()

在有中文輸出的地方,增加一個屬性:fontproperties

pyplot的文本顯示
GridSpec類
pyplot餅圖的繪制
函數 | 說明 |
plt.xlabel() | 對x軸增加文本標簽 |
plt.ylabel() | 對y軸增加文本標簽 |
plt.title() | 對圖形本整體增加文本標簽 |
plt.text() | 在任意位置增加文本 |
plt.annotate() | 在圖形中增加帶箭頭的注釋 |
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(0.0,5.0,0.02)
plt.xlabel('縱軸: 振幅', fontproperties='SimHei', fontsize=20, color = 'green')
plt.ylabel('橫軸: 時間', fontproperties='SimHei', fontsize=20)
plt.title(r'正弦波實例$y=cos(2\pi x)$',fontproperties='SimHei',fontsize=25)
plt.text(2,1,r'$\mu=100$',fontsize=15)
plt.plot(a,np.cos(2*np.pi*a),'r--')
plt.show()
輸出效果

plt.annotate(s,xy=arrow_crd,xytext=text_crd,arrowprops=dict)
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(0.0,5.0,0.02)
plt.plot(a,np.cos(2*np.pi*a),'r--')
plt.xlabel('縱軸: 振幅', fontproperties='SimHei', fontsize=20, color = 'green')
plt.ylabel('橫軸: 時間', fontproperties='SimHei', fontsize=20)
plt.title(r'正弦波實例$y=cos(2\pi x)$',fontproperties='SimHei',fontsize=25)
plt.annotate(r'$\mu=100$',xy=(2,1),xytext=(3,1.5),
arrowprops=dict(facecolor='black',shrink=0.1,width=2))
plt.axis([-1,6,-2,2])
plt.grid()
plt.show()
輸出

pyplot的子繪圖區域
plt.subplot2grid(GridSpec,CurSpec,colspan=1,rowspan=1
)
如繪圖區域2可表示為
plt.subplot2grid((3,3),(1,0),colspan=2,rowspan=1
)
ax1:
plt.subplot2grid((3,3),(0,0),colspan=3
)
ax2:
plt.subplot2grid((3,3),(1,0),colspan=1
)
ax3:
plt.subplot2grid((3,3),(1,2),rowspan=2
)
ax4:
plt.subplot2grid((3,3),(2,0)
)
ax1:
plt.subplot2grid((3,3),(2,1)
)
ax1 | ||
ax2 | ax3 | |
ax4 | ax5 |
import matplotlib.gridspec as gridspec
gs = gridspec.GridSpec(3,3)
ax1 = plt.subplot(gs[0,:])
ax2 = plt.subplot(gs[1,:-1])
ax3 = plt.subplot(gs[1:,-1])
ax4 = plt.subplot(gs[2,0])
ax5 = plt.subplot(gs[2,1])
matplotlib庫基礎圖函數示例
函數 | 說明 |
plt.plot(x,y,fmt,...) | 繪制一個坐標圖 |
plt.boxplot(data,notch,position) | 繪制一個箱形圖 |
plt.bar(left,height,width,bottom) | 繪制一個條形圖 |
plt.barh(width,bottom,left,heitht) | 繪制一個橫向條形圖 |
plt.polar(theta,r) | 繪制極坐標圖 |
plt.pie(data,explode) | 繪制餅圖 |
plt.psd(x,NFFT=256,pad_to,Fs) | 繪制功率譜密度圖 |
plt.specgram(x,NFFT=256,pad_to,F) | 繪制譜圖 |
plt.cohere(x,y,NTTF=256,Fs) | 繪制X-Y相關性函數 |
plt.scatter(x,y) | 繪制散點圖,其中x,y長度相同 |
plt.step(x,y,where) | 繪制步階圖 |
plt.hist(x,bins,normed) | 繪制直方圖 |
plt.contour(X,Y,Z,N) | 繪制等值圖 |
plt.vlines() | 繪制垂直圖 |
plt.stem(x,y,linefmt,markerfmt) | 繪制柴火圖 |
plt.plot_date() | 繪制數據日期 |
import matplotlib.pyplot as plt
labels = 'Frogs','Hogs','Dogs','Logs'
sizes = [15,30,45,10]
explode = [0,0.1,0,0]
plt.pie(sizes, explode = explode,labels = labels, autopct = '%1.1f%%',
shadow = False,startangle = 90)
plt.show()
輸出

import matplotlib.pyplot as plt
labels = 'Frogs','Hogs','Dogs','Logs'
sizes = [15,30,45,10]
explode = [0,0.1,0,0]
plt.pie(sizes, explode = explode,labels = labels, autopct = '%1.1f%%',
shadow = False,startangle = 90)
plt.axis('equal')
plt.show()
輸出

繪制直方圖
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(0)
mu,sigma = 100,20
a = np.random.normal(mu,sigma,size=100)
plt.hist(a,20,normed=1,histtype='stepfilled',facecolor='b',alpha=0.75)
plt.title('Hitogram')
plt.show()
輸出

pyplot極坐標圖的繪制
import matplotlib.pyplot as plt
import numpy as np
N = 20
theta = np.linspace(0.0, 2*np.pi, N, endpoint = False)
radii = 10*np.random.rand(N)
width = np.pi/4*np.random.rand(N)
ax = plt.subplot(111,projection = 'polar')
bars = ax.bar(theta, radii, width=width, bottom = 0.0)
for r, bar in zip(radii, bars):
bar.set_facecolor(plt.cm.viridis(r/10.))
bar.set_alpha(0.5)
plt.show()
輸出

繪制散點圖
#-*- coding=utf8 -*-
# 面向對象繪制散點圖
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()ax.plot(10*np.random.randn(100),10*np.random.randn(100),'o')
ax.set_title('Simple Scatter')
plt.show()
輸出

pandasy庫的介紹
pandas庫的使用
import pandas as pd
pandas基於numpy實現,常與numpy和matplotlib庫一同使用
兩個數據類型 Series DataFrame
基於上述兩個數據類型的各類操作
基本操作,運算操作,特征類操作 關聯類操作
numpy 基礎數據類型 關注數據的結構表達 維度: 數據間關系
pandas:擴展數據類型 關注數據的應用表達 數據與索引間的關系
Series類型:由一組數據及與之相關的數據索引組成
如
>>> import pandas as pd
>>> a = pd.Series(range(10))
>>> a
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
dtype: int32
還可以指定數據索引
>>> a = pd.Series(range(4),index=['a','b','c','d'])
>>> a
a 0
b 1
c 2
d 3
dtype: int32
Series類型可以由如下類型創建:
- Python列表
- 標量值
- python字典
- ndarray
- 其他函數
如
>>> pd.Series(25,index=['a','b','c'])
a 25
b 25
c 25
dtype: int64
從字典類型創建
>>> pd.Series({'a':1,'b':2,'c':3})
a 1
b 2
c 3
dtype: int64
>>> pd.Series({'a':1,'b':2,'c':3},index = ['b','c','d'])#index從字典中進行選擇操作
b 2.0
c 3.0
d NaN
dtype: float64
從ndarray類型創建
>>> pd.Series(np.arange(5),index=np.arange(9,4,-1))
9 0
8 1
7 2
6 3
5 4
dtype: int32
Series類型的基本操作
- 包括index和value兩部分
>>> a.index#獲得索引
Index(['a', 'b', 'c', 'd'], dtype='object')
>>> a.values#獲得數據
array([0, 1, 2, 3])
>>> a[1]#自動索引
1
>>> a['b']#自定義索引
1
>>> a[['b','c']]
b 1
c 2
dtype: int32
- 操作類似於ndarray類型
- 索引方法相同,采用[]
- numpy中運算和操作可用於Series類型
- 可以通過自定義的列表進行切片
- 可以通過自動索引進行切片,如果存在自定義索引,則一同被切片
如
>>> b=pd.Series([9,8,7,6],['a','b','c','d'])
>>> b
a 9
b 8
c 7
d 6
dtype: int64
>>> b[3]
6
>>> b[:3]
a 9
b 8
c 7
dtype: int64
>>> b[b>b.median()]
a 9
b 8
dtype: int64
>>> np.exp(b)
a 8103.083928
b 2980.957987
c 1096.633158
d 403.428793
dtype: float64
- 操作類似於python字典類型
- 通過自定義索引訪問
- 保留字in操作
- 使用.get方法
>>> b=pd.Series([9,8,7,6],['a','b','c','d'])
>>> b['b']
8
>>> 'c' in b
True
>>> 0 in b
False
>>> b.get('f',100)
100
Series類型對齊操作
Series類型的運算中會自動對齊不同索引的數據
>>> b=pd.Series([9,8,7,6],['a','b','c','d'])
>>> a=pd.Series([1,2,3],['c','d','e'])
>>> a+b
a NaN
b NaN
c 8.0
d 8.0
e NaN
dtype: float64
Series類型的name屬性
Series對象和索引都可以有名字,存儲在在屬性.name中
>>> b=pd.Series([9,8,7,6],['a','b','c','d'])
>>> b.name
>>> b.name='Series對象'
>>> b.index.name='索引列'
>>> b
索引列
a 9
b 8
c 7
d 6
Name: Series對象, dtype: int64
Series對象可以隨時修改並立即生效
>>> b=pd.Series([9,8,7,6],['a','b','c','d'])
>>> b['a']=15
>>> b.name='Series'
>>> b
a 15
b 8
c 7
d 6
Name: Series, dtype: int64
>>> b.name='New Series'
>>> b['b','c']=20
>>> b
a 15
b 20
c 20
d 6
Name: New Series, dtype: int64
Series是一維帶‘標簽’數組
DataFrame類型
DataFrame類型由共用相同索引的一組列組成
DataFrame是一個表格型的數據類型,每列值類型可以不同,即有行索引,也有列索引index_0 data_a data_1 ... data_windex_1 data_b data_2 ... data_xindex_2 data_c data_3 ... data_yindex_3 data_d data_4 ... data_z索引 多列數據
常用於表達二維數據,但可以表達多維數據
DataFrame類型可以由如下類型創建
二維ndarray對象
>>> d=pd.DataFrame(np.arange(10).reshape(2,5))
>>> d
0 1 2 3 4
0 0 1 2 3 4
1 5 6 7 8 9
由一維ndarray、列表、字典、元組或Series類型構成的字典
>>> dt=pd.DataFrame({'one':pd.Series([1,2,3],['a','b','c']),
... 'two':pd.Series([9,8,7,6],['a','b','c','d'])})
>>> dt
one two
a 1.0 9
b 2.0 8
c 3.0 7
d NaN 6
>>> pd.DataFrame(dt,index=['b','c','d'],columns=['two','three'])
two three
b 8 NaN
c 7 NaN
d 6 NaN
>>> d1={'one':[1,2,3,4],'two':[9,8,7,6]}
>>> d = pd.DataFrame(d1,index=['a','b','c','d'])
>>> d
one two
a 1 9
b 2 8
c 3 7
d 4 6
Series類型
其他的DataFrame類型
數據類型操作
如何改變Series和DataFrame類型
重新索引增加或重排:重新索引刪除:drop
.reindex(index=None,columns=None,...)
參數 | 說明 |
index, columns | 新的行列自定義索引 |
fill_value | 重新索引中,用於填充缺失位置的值 |
method | 填充方法,ffill當前值向前填充,bfill向后填充 |
limit | 最大填充量 |
copy | 默認True,生成新的對象,False時,新舊相等不復制 |
Series和DataFrame的索引是Index類型,
Index對象是不可修改對象類型
方法 | 說明 |
.append(idx) | 連接另一個Index對象,產生新的Index對象 |
.diff(idx) | 計算差集,產生新的Index對象 |
.intersection(idx) | 計算交集 |
union(idx) | 計算並集 |
delete(loc) | 刪除loc位置處的元素 |
insert(loc,e) | 在loc位置上增加一個元素e |
算術運算法則
算術運算根據行列索引,補齊后運算,運算默認產生浮點數
補齊時缺項填充NaN
二維和一維,一維和零維間為廣播運算
采用+ - * / 符號進行的二元運算產生新的的對象
>>> a = pd.DataFrame(np.arange(12).reshape(3,4))
>>> b = pd.DataFrame(np.arange(20).reshape(4,5))
>>> a+b
0 1 2 3 4
0 0.0 2.0 4.0 6.0 NaN
1 9.0 11.0 13.0 15.0 NaN
2 18.0 20.0 22.0 24.0 NaN
3 NaN NaN NaN NaN NaN
>>> a*b
0 1 2 3 4
0 0.0 1.0 4.0 9.0 NaN
1 20.0 30.0 42.0 56.0 NaN
2 80.0 99.0 120.0 143.0 NaN
3 NaN NaN NaN NaN NaN
方法 | 說明 |
.add(d,**argws) | 類型間加法運算,可選參數 |
.sub(d,**argws) | 類型間減法運算,可選參數 |
.mul(d,**argws) | 類型間乘法運算,可選參數 |
.div(d,**argws) | 類型間除法運算,可選參數 |
>>> a
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
>>> b
0 1 2 3 4
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19
>>> b.add(a,fill_value=100)#fill_value替代NaN,替代后參與運算
0 1 2 3 4
0 0.0 2.0 4.0 6.0 104.0
1 9.0 11.0 13.0 15.0 109.0
2 18.0 20.0 22.0 24.0 114.0
3 115.0 116.0 117.0 118.0 119.0
>>> a.mul(b,fill_value=0)
0 1 2 3 4
0 0.0 1.0 4.0 9.0 0.0
1 20.0 30.0 42.0 56.0 0.0
2 80.0 99.0 120.0 143.0 0.0
3 0.0 0.0 0.0 0.0 0.0
數據的排序
.sort_index(axis=0,ascending=True)