掌握表示、清洗、统计和展示数据的能力
包括 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.htmlmatplotlib的使用 由各种可视化类构成,内部结构复杂,受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)