Python数据分析与展示
Python数据分析与展示
基础知识
Ipython
Ipython是一个功能强大的交互式shell,适合进行交互式数据可视化和GUI相关应用
想要汉化可以参考这个github上的汉化链接
?
:变量名后跟?
如:a?
来获取变量相关的类型、值以及相关的描述信息。对于函数增加?
能够获得函数的源代码
%run+python文件
命令:用于执行py文件,同时会生成一个新的空的命名空间(即,该程序内部需要包含足够的import变量)
其他相关的魔术命令:
常用命令 | 说明 |
---|---|
%magic | 显示所有魔术命令 |
%hist | IPython命令的输入历史 |
%pdb | 异常发生后自动进入调试器 |
%reset | 删除当前命名空间中的全部变量或名称 |
%who | 显示lpython当前命名空间中已经定义的变量 |
%time statement | 给出代码的执行时间,statement表示一段代码 |
%timeit statement | 多次执行代码,计算综合平均执行时间 |
NumPy库
NumPy是一个开源的 Python科学计算基础库。
- 一个强大的N维数组对象 ndarray
- 广播功能函数
- 整合C/C++/Fortran代码的工具
- 线性代数、傅里叶变换、随机数生成等功能
NumPy是 SciPy、 Pandas等数据处理或科学计算库的基础。
引入:import numpy as np
基本知识
数据的维度
维度:一组数据的组织形式
一维数据:一维数据由对等关系的有序或无序数据构成,采用线性方式组织。如:列表、数组(和列表一样,均表示一组数据的有序结构,与列表的区别如下)、集合等概念(对应python中的列表(有序)和集合(无序))
- 列表:列表项的数据类型可以不同
- 数组:数据类型必须相同
二维数据:二维数据由多个—维数据构成,是一维数据的组合式。如:表格(对应python中的列表)
多维数据:多维数据由一维或二维数据在新维度上扩展形成。(对应python中的多维列表)
高维数据:高维数据仅利用最基本的二元关系展示数据间的复杂结构(可以理解为由键值对将数据组织起来形成的数据方式)。如:json(对应python中的字典或数据表示格式(JSON、XML、YAML))
数组对象:ndarray
ndarray是一个多维数组对象,由两部分构成:
- 实际的数据
- 描逃这些数据的元数据(数据维度、数据类型等)
ndarray数组一般要求所有元素类型相同(同质),数组下标从0开始。
ndarray在程序中的别名是:array
1 | # 生成一个 ndarray数组 |
基本概念:
- 轴(axis):保存数据的维度
- 秩(rank):轴的数量(即有多少个维度)
基本属性:
属性 | 说明 |
---|---|
.ndim | 秩,即轴的数量或维度的数量 |
.shape | ndarray对象的尺度,对于矩阵,n行m列 |
.size | ndarray对象元素的个数,相当于.shape中n*m的值 |
.dtype | ndarray对象的元素类型 |
.itemsize | ndarray对象中每个元素的大小,以字节为单位 |
元素类型:
数据类型 | 说明 |
---|---|
bool | 布尔类型,True或False |
intc | 与C语言中的int类型一致,一般是int32或int64 |
intp | 用于索引的整数,与C语言中ssize_t一致,int32或int64 |
int8 | 字节长度的整数,取值:[-128,127] |
int16 | 16位长度的整数,取值:[-32768,32767] |
int32 | 32位长度的整数,取值:[-2^31^,2^31^-1] |
int64 | 64位长度的整数,取值:[-2^63^,2^63^-1] |
uint8 | 8位无符号整数,取值:[0,255] |
uint16 | 16位无符号整数,取值:[0,65535] |
uint32 | 32位无符号整数,取值:[0,2^32^-1] |
uint64 | 64位无符号整数,取值:[0,2^64^-1] |
float16 | 16位半精度浮点数:1位符号位,5位指数,10位尾数 |
float32 | 32位半精度浮点数:1位符号位,8位指数,23位尾数 |
float64 | 64位半精度浮点数:1位符号位,11位指数,52位尾数 |
complex64 | 复数类型,实部和虚部都是32位浮点数 |
complex128 | 复数类型,实部和虚部都是64位浮点数 |
ndarray数组可以由非同质对象构成。非同质 ndarray元素为对象类型。非同质 ndarray对象无法有效发挥 NumPy优势,尽量避免使用。(当元素的类型并不相同或每一个元素的维度数据并不相同的时候,会将每个元素认为一个对象,将该对象认为同质的数据类型)
1 | #同质 |
创建和变换
创建方法:
-
从 Python中的列表、元组等类型创建 ndarray数组。
1
2x = np.array(list/tuple)
x = np.array(list/tuple, dtype=np.float32)#指定类型- 当np. array()不指定 dtype时, NumPy将根据数据情况关联一个 dtype类型
- 只要元组和列表包含的数据个数和类型相同,就可以混合使用
-
使用 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,类型为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.coucatenate() 将两个或多个数组合井成一个新的数组 例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
3610) np.array(
array(10)
3,6)) np.ones((
array([[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.]])
3,6), dtype=np.int32) np.zeros((
array([[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]])
5) np.eye(
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
2,3,4)) np.ones((
array([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]])
2,3,4)) x = np.ones((
x.shape
(2, 3, 4)
1,10,4) #起始1 末尾10 4个元素 np.linspace(
array([ 1., 4., 7., 10.])
1,10,4,endpoint=False) #最后一个元素10是否为4个元素中的一个 np.linspace(
array([1. , 3.25, 5.5 , 7.75])
1,10,4) a = np.linspace(
1,10,4,endpoint=False) b = np.linspace(
np.concatenate((a,b))
array([ 1. , 4. , 7. , 10. , 1. , 3.25, 5.5 , 7.75]) -
从字节流( raw bytes)中创建 ndarray数组。
-
从文件中读取特定格式,创建 ndarray数组。
变换:
维度变换
方法 | 说明 |
---|---|
.reshape(shape) | 不改变数组元素,返回一个 shape形状的数组,原数组不变 |
.resize(shape) | 与.reshape()功能一致,但修改返回的数组时会改变原数组 |
.swapaxes(ax1,ax2) | 将数组n个维度中两个维度进行调换 |
.flatten() | 对数组进行降维,返回折叠后的一维数组,原数组不变 |
类型变换
方法 | 说明 |
---|---|
.astype(new_type) | 改变数据中元素的类型,原数组不变 |
.tolist() | 将ndarray数组转化为list |
数组的操作
索引:获取数组中特定位置元素的过程
切片:获取数组元素子集的过程
一维数组的索引和切片:与 Python的列表类似
1 | 9,8,7,6,5]) a = np.array([ |
多维数组的索引和切片:
1 | # 索引 |
数组的运算
数组与标量(一个数据)之间的运算等价于数组中的每一个元素都与这个标量进行运算
例子:
1 | 24).reshape((2,3,4)) a = np.arange( |
相关函数(均为对数组中的各个元素进行操作,且均为新生成的数组,不改变原始数组):
一元函数
函数 | 说明 |
---|---|
np.abs(x)、np.fabs(x) | 计算数组各元素的绝对值 |
np.sqrt() | 计算数组各元素的平方根 |
np.square(x) | 计算数组各元素的平方 |
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(x)、np.cosh(x)、np.sin(x)、np.sinh(x)、np.tan(x)、np.tanh(x) | 计算数组各元素的普通型和双曲型三角函数 |
np.exp(x) | 计算数组各元素的指数值 |
np.sign(x) | 计算数组各元素的符号值,1(+),0,-1(-) |
二元函数
函数 | 说明 |
---|---|
+、-、*、/、** | 两个数组各元素进行对应运算 |
np.maximum(x,y)、np.fmax()、np. minimum(x,y)、np.fmin() | 元素级的最大值/最小值计算 |
np.mod(x,y) | 元素级的模运算 |
np. copysign(x,y) | 将数组y中各元素值的符号赋值给数组x对应元素 |
>、<、>=、<=、==、!= | 算术比较,产生布尔型数组 |
数据存取与函数
CSV文件存取
CSV( Comma-Separated value,逗号分隔值)是—种常见的文件格式,用来存储批量数据。(CSV文件只能用来保存一维二维数组)
将数据写入csv文件:
1 | np.savetxt(frame, array, fmt='%.18e', delimeter=None) |
- frame:文件、字符串或产生器,可以是.gz或.bz2的压缩文件。
- array:存入文件的数组。
- fmt:写人文件的格式,例如:%d、%.2f、%.18e。
- delimiter:分割字符串,默认是空格(csv文件中是逗号
,
)
读取csv文件中的数据:
1 | np.loadtxt(frame, dtype=np.float, delimeter=None, unpack=False) |
- frame:文件、字符串或产生器,可以是.gz或.bz2的压缩文件。
- dtype:数据类型,可选。
- delimiter:分割字符串,默认是空格(csv文件中是逗号
,
) - unpack:如果True,读入属性将分别写入不同变量
多维数据的存取
存储:
1 | a.tofile(frame, sep='', format='%s') |
- frame:文件、字符串
- sep:数据分割字符串,如果是空串,写入文件为二进制。
- format:写人数据的格式
注意:将数组写入文件后,其中的维度信息会丢失,可以利用reshape方法:np.fromfile().reshape()
在读取的时候还原维度信息,但是需要之前数组的维度信息
读取:
1 | a.fromfile(frame, dtype=float, count=-1, sep='') |
- frame:文件、字符串
- dtype:读取的数据类型。
- count:读入元素个数,-1表示读入整个文件。
- sep:数据分割字符串,如果是空串,写入文件为二进制。
例子:
1
2
3 100).reshape(5, 10, 2) a = np.arange(
"b.dat", format='%d') a.tofile(
"b.dat", dtype=np.int).reshape(5, 10, 2) c = np.fromfile(
注意:该方法需要读取时知道存入文件时数组的维度和元素类型,a.tofile()和 np.fromfile()需要配合使用。为解决上述维度丢失的情况,可以通过元数据文件来存储额外信息
Numpy便捷文件存储
该方法可以解决上述方法的维度丢失情况
存储:
1 | np.save(fname, array) |
- frame:文件名,以.npy为扩展名,压缩扩展名为.npz
- save方法存为.npy文件,savez方法存为压缩文件.npz
- array:数组变量
读取:
1 | a.load(fname) |
- frame:文件名,以.npy为扩展名,压缩扩展名为.npz
随机数函数
python中提供random库可以使用随机数,但是只能生成一般的随机数,Numpy中提供random字库提供numpy中的随机数,基本格式为np.random.*
,*
为random库中提供的函数,具体有:
函数 | 说明 |
---|---|
rand(d0,d1,…,dn) | 根据d0-dn(视为shape信息)创建随机数数组,浮点数,[0,1), 均匀分布 |
randn(d0,d1,…,dn) | 根据d0-dn(即视为shape信息)创建随机数数组,标准正态分布 |
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(locc, scale,size) | 产生具有正态分布的数组,loc均值,scale标准差,size形状 |
poisson(lam,size) | 产生具有泊松分布的数组,lam随机事件发生率,size形状 |
例子:
1 | 100, 200, (3,4)) a = np.random.randint( |
统计函数
基本格式为np.*
,*
为random库中提供的函数,具体有:
函数 | 说明 |
---|---|
sum(a, axis=None) | 根据给定轴axis计算数组a相关元素之和,axis整数或元组 |
mean(a, axis=None) | 根据给定轴axis计算数组a相关元素的期望,axis整数或元组 |
average(a,axis=None, weights=None) | 根据给定轴axis计算数组a相关元素的加权平均值,weights为每个元素的权重 |
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中元素的中位数(中值) |
- axis=None即所有轴
例子1:
1 | 15).reshape(3, 5) a = np.arange( |
例子2:
1 | 15,0,-1).reshape(3, 5) b = np.arange( |
梯度函数
梯度:连续值之间的变化率,即斜率。具体来说,XY坐标轴连续三个X坐标对应的Y轴值:a,b,c,其中,b的梯度是:(c-a)/2
numpy中梯度函数只有一个:
1 | np.gradient(f) |
- 计算数组f中元素的梯度,当f为多维时,返回每个维度梯度
例子:
1 | #一维数组 |
- 若一个n维数组,经过gradient求梯度后会生成n个数组,每个数组代表原始的n维数组中一个元素在第n维度的梯度值
图像手绘效果
1 | from PIL import Image |
Matplotlib库
Matplotlib是Python优秀的数据可视化第三方库,由各种可视化类构成,内部结构复杂。
matplotlib.pyplot
是绘制各类可视化图形的命令子库,相当于快捷方式。所以基本上只会对该子库进行操作
引入:import matplotlib.pyplot as plt
基本知识
plot函数
基本绘图函数
1 | plt.plot(x, y, format_string, **kwargs) |
-
x:X轴数据,列表或数组,可选。
-
y:Y轴数据,列表或数组。
-
format_string:控制曲线的格式字符串,可选。由颜色字符、风格字符和标记字符组成
-
常用颜色字符:
颜色字符 说明 颜色字符 说明 ‘b’ 蓝色 ‘m’ 洋红色 magenta ‘g’ 绿色 ‘y’ 黄色 ‘r’ 红色 ‘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默认不支持中文显示,可以通过以下两种方式设置:
一、使用rcParams属性改变pyplot全局字体
1 | import matplotlib.pyplot as plt |
-
rcParams常用属性说明:
属性 说明 ‘font.family’ 用于显示字体的名字 ‘font.style’ 字体风格,正常’normal’或斜体’italic’ ‘font.size’ 字体大小,整数字号或者’large’、‘x-small’ -
常用中文字体:
- ‘SimHei’:中文黑体
- ‘Kaiti’:中文楷体
- ‘LiSu’:中文隶书
- ‘FangSong’:中文仿宋
- ‘YouYuan’:中文幼圆
- ‘STSong’:华文宋体
二、在有中文输出的地方,增加一个属性: fontproperties
1 | import matplotlib.pyplot as plt |
文本显示
常用函数:
函数 | 说明 |
---|---|
plt.xlabel() | 对X轴增加文本标签 |
plt.ylabel() | 对Y轴增加文本标签 |
plt.title() | 对图形整体增加文本标签,放于整个图像的正上方 |
plt.text() | 在任意位置增加文本 |
plt.annotate() | 在图形中增加带箭头的注解 |
其中annotate函数有:
1 | plt.annotate(s, xy=arrow_crd, xytext=text_crd, arrowprops=dict) |
- s:带注解字符串
- xy:箭头所在位置
- xytext:文本显示位置
- arrowprops:字典类型,包含箭头显示的一些属性
例子:
1 | import matplotlib.pyplot as plt |
子绘图区域
如果在一个绘图区域中,希望分成几个子绘图区域来绘制图像,可以通过使用subplot函数:
1 | plt.subplot(nrows, ncols, plot_number) |
- 该函数将绘图区域划分成了横纵数量为nrows,纵轴数量为ncols的子区域
- plot_number为在划分后的区域中,当前选中的那块区域(区域编号为从左到右,从上倒下,从1开始)
- 中间点逗号可以省略
对于绘制较为复杂的子区域(不能由行列来划分,有些子区域占据多行或多列),需要通过以下函数来进行操作:
1 | plt.subplot2grid(GridSpec, CurSpec, colspan=l, rowspan=l) |
理念:设定网格,选中网格,确定选中行列区域数量,编号从0开始.
例子:
绘制以下区域图形:
1 | #ax1: |
通过GridSpec类能够简化上述流程:
1 | import matplotlib.gridspec as gridspec |
基础绘图函数
函数 | 说明 |
---|---|
plt.plot(x.y,fmt,…) | 绘制一个坐标图(直角/极坐标) |
plt.boxplot(data,notch,position) | 绘制一个箱形图 |
plt.bar(left,height,width,bottom) | 绘制一个条形图 |
plt.barh(width,bottom,left,height) | 绘制一个横向条形图 |
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,NFFT=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() | 绘制数据日期 |
Pandas库
Pandas是Python第三方库,提供高性能易用数据类型和分析工具,引用如下:
1 | import pandas as pd |
Pandas基于NumPy实现,常与 NumPy和Matplotlib一同使用
Pandas主要提供两个数据类型:Series(一维),DataFrame(二维)
Series类型
Series类型由一组数据及与之相关的数据索引组成。其索引由pandas自动构建或由用户自定义生成:
-
自动构建:
1
2
3
4
5
6
7
8import pandas as pd
9,8,7,6]) a = pd.Series([
a
0 9 # 左侧为pandas自动追加的索引,右侧为数据
1 8
2 7
3 6
dtype: int64 # NumPy中的数据类型 -
用户自定义索引:
1
2
3
4
5
6
7
8import pandas as pd
9,8,7,6], index=['a','b','c','d']) # 若为第二个参数,index=可以省略 b = pd.Series([
b
a 9
b 8
c 7
d 6
dtype: int64
Series类型可以由以下类型创建:
-
Python列表
-
标量值
1
2
3
4
5
6
7import pandas as pd
25, index=['a','b','c']) # 此时index=不能省略 s = pd.Series(
s
a 25
b 25
c 25
dtype: int64 -
Python字典
1
2
3
4
5
6
7
8
9
10
11
12
13
14import pandas as pd
'a':9,'b':8,'c':7}) d = pd.Series({
d
a 9
b 8
c 7
dtype: int64
'a':9,'b':8,'c':7}, index=['c','a','b','d']) # index从字典中进行选择操作 e = pd.Series({
e
c 7.0
a 9.0
b 8.0
d NaN
dtype: float64 -
ndarray
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18import pandas as pd
import numpy as np
5)) n = pd.Series(np.arange(
n
0 0
1 1
2 2
3 3
4 4
dtype: int32
5),index=np.arange(9,4,-1)) m = pd.Series(np.arange(
m
9 0
8 1
7 2
6 3
5 4
dtype: int32 -
其他函数(range()等函数)
基本操作
Series类型包括index和values两部分(Series类型的操作类似ndarray类型、Python字典类型),可以通过.index
和.values
分别获得索引和数据
1 | import pandas as pd |
获得索引值和值的操作:
1 | 'b'] # 自定义索引 b[ |
Series类型的操作类似ndarray类型:
-
索引方法相同,采用[]
-
NumPy中运算和操作可用于Series类型
-
可以通过自定义索引的列表进行切片
-
可以通过自动索引进行切片,如果存在自定义索引, 则一同被切片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
171] # 索引出来的是值 b[
8
3] # 切片出来的任是Series b[:
a 9
b 8
c 7
dtype: int64
# b.median()=7.5 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- 对Series类型的切片及相关运算都会返回Series类型
- 如果只选择Series类型中的一个值,此时返回的是一个值
Series类型的操作类似Python字典类型
-
通过自定义索引访问
-
保留字
in
操作(只判断自定义索引)1
2
3
4'c' in b # 判断'c'是否为自定义索引
True
0 in b
False -
使用
.get()
方法1
2'f',100) # 从b中提取索引'f'对应的值,不存在则返回100,否则返回'f'对应的值 b.get(
100
对齐操作:Series类型在运算中会自动对齐不同索引的数据(Series+Series时,索引值相同的值进行计算,不同的值不进行计算)
1 | import pandas as pd |
Series对象和索引都可以有一个名字,存储在属性.name
中
1 | import pandas as pd |
Series对象可以随时修改并即刻生效
Dataframe类型
Dataframe类型由共用相同索引的一组列组成(表格),是二维带“标签”数组:
- 是一个表格型的数据类型,每列值类型可以不同或相同
- 既有行索引(index)、也有列索引(column)
- axis=0(0轴)为行,即index
- axis=1(1轴)为列,即column
- 常用于表达二维数据,但可以表达多维数据
创建方式
-
二维 ndarray对象
1
2
3
4
5
6
7import pandas as pd
import numpy as np
10).reshape(2,5)) # 10个元素 2*5的大小 pd.DataFrame(np.arange(
0 1 2 3 4 #← 自动列索引
0 0 1 2 3 4
1 5 6 7 8 9
#↑ 自动行索引 -
一维 ndarray、列表、字典、元组或 Series构成的字典
-
Series构成的字典:
1
2
3
4
5
6
7
8'one':pd.Series([1,2,3], index=['a','b','c']), dt = {
'two':pd.Series([9,8,7,6], index=['a','b','c','d'])}
pd.DataFrame(dt)
one two
a 1.0 9
b 2.0 8
c 3.0 7
d NaN 6可通过
index
指定行索引,columns
指定列索引:1
2
3
4
5'b','c','d'], columns=['two','three']) pd.DataFrame(dt, index=[
two three
b 8 NaN
c 7 NaN
d 6 NaN -
列表类型的字典:
1
2
3
4
5
6
7'one':[1,2,3,4], 'two':[9,8,7,6]} dl = {
'a','b','c','d']) pd.DataFrame(dl, index=[
one two
a 1 9
b 2 8
c 3 7
d 4 6
-
-
Series类型
-
其他的 Dataframe类型
可以通过.index
、.columns
和.values
分别获得行索引、列索引和表中的数据
1 | 'one':[1,2,3,4], 'two':[9,8,7,6]} dl = { |
获得Dataframe中的元素:
1 | 'one'] # 列索引标记 获得一列数据(Series类型) d[ |
- 在pandas的1.0.0版本开始,移除了
Series.ix
和DataFrame.ix
方法,用loc方法或者iloc方法进行替换。loc、iloc使用
数据类型操作
Index对象
Series和 Dataframe的索引是Index
类型,Index对象是不可修改类型,其常用方法如下:
方法 | 说明 |
---|---|
.append(idx) |
连接另一个Index对象,产生新的Index对象 |
.diff(idx) |
计算差集,产生新的Index对象 |
.intersection(idx) |
计算交集 |
.union(idx) |
计算并集 |
.delete(loc) |
删除loc位置处的元素 |
.insert(loc,e) |
在loc位置增加一个元素e |
重新索引(增加或重排)
.reindex(index=None, columnS=None,...)
能够改变或重排 Series和 Dataframe索引
- index, columns:新的行列自定义索引
- fill_value:重新索引中,用于填充缺失位置的值
- method:填充方法,ffill当前值向前填充,bfill向后填充
- limit:最大填充量
- copy:默认True,生成新的对象, False时,新旧相等不复制
1 | 'one':pd.Series([1,2,3], index=['a','b','c']), dt = { |
删除
.drop()
能够删除 Series和 DataFrame指定行或列索引,会生成新的DataFrame对象
- 默认
axis=0
,即默认对行进行操作。如需对列操作,需指定axis=1
1 | import pandas as pd |
数学类型运算
算术运算
-
算术运算根据行列索引,补齐后运算,运算默认产生浮点数
-
补齐时缺项填充NaN(空值)
-
二维和一维、一维和零维间为广播运算
-
广播运算:两个数组进行运算,一个是Series数组(即一维数组),另一个是DataFrame数组(多维数组):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2620).reshape(4,5)) a = pd.DataFrame(np.arange(
a
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
4)) b = pd.Series(np.arange(
b
0 0
1 1
2 2
3 3
dtype: int32
10 b-
0 -10
1 -9
2 -8
3 -7
dtype: int32
a-b
0 1 2 3 4
0 0.0 0.0 0.0 0.0 NaN
1 5.0 5.0 5.0 5.0 NaN
2 10.0 10.0 10.0 10.0 NaN
3 15.0 15.0 15.0 15.0 NaN-
一维和零维的运算:一维上每个值加上零维的数据
-
不同维度间为广播运算,一维Series默认在轴1参与运算
- 一维数组看成是一行,分别与多维数组的每一行进行运算
-
可以通过
axis=0
指定到0轴上,即列上:1
2
3
4
5
60) a.sub(b,axis=
0 1 2 3 4
0 0 1 2 3 4
1 4 5 6 7 8
2 8 9 10 11 12
3 12 13 14 15 16
-
-
-
采用±*/符号进行的二元运算产生新的对象
.add(d,**argws)
:类型间加法运算,可选参数- fill_value:用于填充缺失位置的值
.sub(d,**argws)
:类型间减法运算,可选参数.mul(d,**argws)
:类型间乘法运算,可选参数.div(d,**argws)
:类型间除法运算,可选参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2512).reshape(3,4)) a = pd.DataFrame(np.arange(
a
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
20).reshape(4,5)) b = pd.DataFrame(np.arange(
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
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
0) a.mul(b,fill_value=
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
比较运算
-
比较运算只能比较相同索引的元素,不进行补齐
-
二维和一维、—维和零维间为广播运算
-
用>、<、>=、<=、==、!=等符号进行的二元运算产生布尔对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2212).reshape(3,4)) a = pd.DataFrame(np.arange(
a
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
12,0,-1).reshape(3,4)) b = pd.DataFrame(np.arange(
b
0 1 2 3
0 12 11 10 9
1 8 7 6 5
2 4 3 2 1
a>b
0 1 2 3
0 False False False False
1 False False False True
2 True True True True
a==b
0 1 2 3
0 False False False False
1 False False True False
2 False False False False
排序
.sort_index(axis=0, ascending=True)
方法在指定轴上根据索引进行排序,默认升序
- axis:排序的轴,默认0轴,即行
- ascending:是否递增排序,默认True
1 | 20).reshape(4,5), index=['c','a','b','d']) b = pd.DataFrame(np.arange( |
.sort_values()
方法在指定轴上根据数值进行排序,默认升序
Series.sort_values(axis=0, ascending=True)
- axis:排序的轴,默认0轴,即行
- ascending:是否递增排序,默认True
DataFrame.sort_values(by, axis=0, ascending=True)
- by:axis轴上的某个索引或索引列表
1 | 20).reshape(4,5), index=['c','a','d','b']) b = pd.DataFrame(np.arange( |
- NaN统一放到排序未尾(无论ascending为何值)
基本统计分析
适用于 Series和 DataFrame类型:
方法 | 说明 |
---|---|
.sum() |
计算数据的总和,按0轴计算,下同 |
.count() |
非NaN值的数量 |
.mean() .median() |
计算数据的算术平均值、算术中位数 |
.var() .std() |
计算数据的方差、标准差 |
.min() .max() |
计算数据的最小值、最大值 |
适用于 Series类型:
方法 | 说明 |
---|---|
.argmin() .argmax() |
计算数据最大值、最小值所在位置的索引位置(自动索引) |
.idxmin() .idxmax() |
计算数据最大值、最小值所在位置的索引(自定义索引) |
统计汇总(适用于 Series和 DataFrame类型):
方法 | 说明 |
---|---|
.describe() |
针对0轴(各列)的统计汇总 |
对于Series类型:
1 | 9,8,7,6], index=['a','b','c','d']) a = pd.Series([ |
对于DataFrame类型:
1 | 20).reshape(4,5), index=['c','a','d','b']) b = pd.DataFrame(np.arange( |
累计统计信息
适用于 Series和 DataFrame类型:
方法 | 说明 |
---|---|
.cumsum() |
依次给出前1、2、…、n个数的和 |
.cumprod() |
依次给出前1、2、…、n个数的积 |
.cummax() |
依次给出前1、2、…、n个数的最大值 |
.cummin() |
依次给出前1、2、…、n个数的最小值 |
- 默认为列,如需改为行,需添加参数
axis=1
例子:
1 | 20).reshape(4,5), index=['c','a','d','b']) b = pd.DataFrame(np.arange( |
适用 Series和 DataFrame类型,滚动计算(窗囗计算):
方法 | 说明 |
---|---|
.rolling(w).sum() |
依次计算相邻w个元素的和 |
.rolling(w).mean() |
依次计算相邻w个元素的算术平均值 |
.rolling(w).var() |
依次计算相邻w个元素的方差 |
.rolling(w).std() |
依次计算相邻w个元素的标准差 |
.rolling(w).min() .max() |
依次计算相邻w个元素的最小值和最大值 |
例子:
1 | 20).reshape(4,5), index=['c','a','d','b']) b = pd.DataFrame(np.arange( |
相关分析
适用 Series和 DataFrame类型:
方法 | 说明 |
---|---|
.cov() |
计算协方差矩阵 |
.corr() |
计算相关系数矩阵,Pearson、 Spearman、 Kendall等系数 |
1 | 3.04,22.93,12.75,22.6,12.33],index=['2008','2009','2010','2011','2012']) hprice = pd.Series([ |