Python数据分析
Python数据分析
NumPy
NumPy简介
NumPy
是一个开源的Python
科学计算基础库
- 一个强大的N维数据数组对象
ndarray
- 广播功能函数
- 线性代数,傅里叶变换,随机数生成等功能
NumPy
是SciPy
,Pandas
等数据处理或科学计算库的基础
数据的维度
维度:是一组数据的组织形式
一维数据
- 定义:由对等关系的有序或无序数据构成,采用线性方式组织
- 有序一维结构:列表(
list[ ]
),元组(tuple( )
),数组 - 无序一维结构:字典(
dict{ : }
),集合(set{ }
)
二维数据
- 定义:二维数据由多个一维数据构成,是一维数据的组合
- 在
python
中,列表的元素也可以是另外一个列表,这样的嵌套就形成了一个二维数据
高维数据
- 定义:
python
中,字典就表示的是高维数据,由键值对存储信息
数组对象 ndarray
定义
数组:是一种一维有序数据结构,要求数据结构里的所有数据类型必须相同
ndarray
:就是NumPy
库所提供的一个多维数组对象,要求所有元素类型相同,数据的下标从0开始
ndarray.array()
函数:生成一个ndarray
数组,是[ ]形式,元素由空格分割
1 | ndarray.array([[1,2,3],[4,5,6]]) |
Python
中虽然有数据结构list
存储有序数据,但是其不支持矢量化计算,运算效率很低
而Numpy
库提供了很多用于矢量化运算的函数和方法。
矢量化运算是指对数组中的每个元素进行相同的操作,而不需要使用循环。这样可以提高代码的效率和简洁性。
以下举例说明NumPy
相比list
的优势:
假设A和B是元素个数相同的数组,求$A^2+B^3$ :
在使用NumPy
前,需要声明要引入Numpy
这个包,并可以重命名为np
这个简写
可以看到,用list
计算,需要经过循环,而引入NumPy
计算,可以直接计算得出结果
对象的属性
轴(axis
):保存数据的维度 秩(rank
):轴的数量
假设我们通过np.array()
函数生成了一个ndarray
对象,命名为a
属性 | 说明 |
---|---|
a.ndim | 秩,即维度的数量,或者说,数组的行数n |
a.shape | 对象的尺度,数组的n行m列 |
a.size | 元素的个数,相当于shape中n*m的值 |
a.dtype | 元素类型 |
a.itemsize | 每个元素的大小,以字节为单位 |
a.T | a数组的转置 |
例:
1 | import numpy as np |
1 | [[1 2 3] |
数据类型
数据类型 | 说明 |
---|---|
bool | 布尔类型,True或False |
int8 | 字节长度的整数,取值:[-128,127] |
int16 | 16位长度整数,取值在$[-2^{15}, 2^{15}-1]$ |
int32 | 32位长度整数,取值在$[-2^{31}, 2^{31}-1]$ |
int64 | 64位长度整数,取值在$[-2^{63}, 2^{63}-1]$ |
uint8 | 8位无符号整数,取值在[0,255] |
uint16 | 16位无符号整数,取值在$[0,2^{16}-1]$ |
uint32 | 32位无符号整数,取值在$[0,2^{32}-1]$ |
float16 | 16位半精度浮点数:1位符号位,5位指数,10位尾数 |
complex64 | 复数类型,实部和虚部都是32位浮点数 |
Python
基本语法只能支持整数,浮点数和复数,ndarray
所支持的数据类型更加丰富
创建
一共4种方法
- 从Python中的列表,元组等类型创建ndarray数组
- 使用Numpy中函数创建ndarray数组,如:arrange,ones等
- 从字节流中创建
- 从文件中读取特定格式
- 从
Python
中的列表,元组等类型创建ndarray
数组
使用Numpy
中的array
函数,a=np.array(list/tuple,dtype=np.int16)
,表示将列表/元组转换为ndarray
数组,数据类型是int16
如果不指定dtype
的话,Numpy
会根据数据情况关联一个dtype
类型
1 | x=np.array([1,2,3]) #从列表中创建数组 |
- 使用
Numpy
中函数创建ndarray
数组
np.arrange(n)
函数:类似range()
函数,返回ndarray
类型,元素从0到n-1
1 | print(np.arange(10)) |
np.ones(shape)
函数:根据shape
生成一个全1数组,shape
是元组类型,用于指定数组的行列数
1 | print(np.ones((2,2))) |
np.zeros(shape)
函数:根据shape
生成一个全0数组
1 | print(np.zeros((2,2))) |
np.full(shape,val)
函数:根据shape
生成一个数组,每个元素值都是val
1 | print(np.full((2,2),6)) |
np.eye(n)
函数:创建一个$n*n$的单位数组,对角线为1,其余为0
1 | print(np.eye(2)) |
np.linspace(start,end,num)
函数:根据起止数据等间距地填充数据,形成数组
1 | print(np.linspace(1,10,5)) |
总结:
函数 | 说明 |
---|---|
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.linspace() | 根据起止数据等间距地填充数据,形成数组 |
变换
- 维度变换
ndarray.reshape(shape)
方法:不改变数组元素,返回一个shape
形状数组,原数组不变
你可以直接在shape里面输入-1,表示该维度的大小应该由数组的总大小和其他维度的大小自动计算得出。
1 | x=np.ones((2,3)) |
ndarray.resize(shape)
方法:与reshape
功能一致,但修改原数组
1 | x=np.ones((2,3)) |
ndarray.swapaxes(ax1,ax2)
方法:将数组n
个维度中的两个维度进行调换
flattern()
:对数组进行降维,返回折叠后的一维数组,原数组不变
1 | x=np.ones((2,3)) |
- 类型变换
ndarray.astype(dtype)
方法:会创建一个dytpe类型的新的数组,数据和原数组一致
1 | a=np.ones((2,2),dtype=np.int) |
ndarray.tolist()
方法:创建一个列表,列表元素和数组一致
1 | x=np.ones((2,3)) |
总结:
方法 | 说明 |
---|---|
.reshape(shape) | 不改变数组元素,返回一个shape形状的数组,原数组不变 |
.resize(shape) | 与.reshape()功能一致,但修改原数组 |
.swapaxes(ax1,ax2) | 将数组n个维度中两个维度进行调换 |
.flatten() | 对数组进行降维,返回折叠后的一维数组,原数组不变 |
运算
数组与标量之间的运算作用于数组的每一个元素
1 | a=np.arrange(10).reshape(2,5) |
可以看到,每个元素都乘以2了
一元函数
函数 | 说明 |
---|---|
np.sort(x) | 排序,并返回一个排序后的数组 |
np.abs(x) | 计算数组各元素的绝对值 |
np.sqrt(x) | 计算数组各元素的平方根 |
np.square(x) | 计算数组元素各元素的平方 |
np.log(x) | 计算数组各元素的自然对数 |
np.rint(x) | 计算数组各元素的四舍五入的值 |
np.cos(x) | 计算数组各元素的余弦函数 |
np.exp(x) | 计算数组各元素的指数值 |
np.sign(x) | 计算数组各元素的符号值 1,0,-1 |
二元函数
函数 | 说明 |
---|---|
+ - * / | 两个数组各元素进行对应运算 |
@ | 两个数组进行矩阵乘法 |
np.power(x,y) | 求元素的幂 |
np.maximum(x,y) | 求元素的最大值 |
np.mod(x,y) | 元素级的模运算 |
np.copysign(x,y) | 将数组y中各元素符号赋值给x |
> < == != | 算术比较,比产生一个布尔型数组 |
这里讲一下元素乘法*
和矩阵乘法@
之间的区别
1 | import numpy as np |
对于X @ theta
(矩阵乘法),结果是一个一维数组,其元素是X
的每一行和theta
的点积:这里,50 = 1*7 + 2*8 + 3*9
,122 = 4*7 + 5*8 + 6*9
。
对于X * theta
(元素级别的乘法),结果是一个二维数组,其元素是X
和theta
的对应元素的乘积:这里,第一行[7, 16, 27]
是[1, 2, 3]
和[7, 8, 9]
的元素级别的乘积,第二行[28, 40, 54]
是[4, 5, 6]
和[7, 8, 9]
的元素级别的乘积。
矩阵
ndarray
中的array
只是数组,进行矩阵运算,比如求逆矩阵之类的,很复杂,将ndarray
的array
数组转换为matrix
矩阵形式,可以很快的求解逆矩阵
np.matrix()
方法:创建方法和np.array()
类似
matrix
对象有如下属性:
属性 | 说明 |
---|---|
I | 返回矩阵的逆矩阵,必须是方阵 |
H | 返回矩阵的共轭转置矩阵,必须是方阵 |
T | 返回矩阵的转置矩阵 |
A | 返回矩阵的数组视图 |
例:
1 | import numpy as np |
修改
插入
np.insert(x,place,element,axis)
函数:
x
:被插入元素的数组名称place
:插入的位置element
:插入的元素axis
:指定插入的轴(维度),如果是0,表示按行删除;如果是1,表示按列删除
最后会返回一个新的数组
1 | A = np.array ([[1, 2, 3], [6, 7, 8]]) |
具体到例子中来,A
表示要被插入的数组,2
表示插入的位置第2个,[4,5]
表示插入的元素,而最后的axis=1
表示,在第1个维度上插入,也就是列,所以最后会把[4,5]插入到第2列之后去
再写一个例子:
1 | A=np.arange(6).reshape((2,3)) |
np.insert(A,0,B,0)
表示,把B插入到A中,在第0个位置,并且维度是0,也就是第0行
拼接
np.concatenate((tuple),axis)
函数:
tuple
:要连接的数组的元组(),如果是(a,b),代表将a和b连接在一起axis
:指定连接的维度
1 | A = np.array ([[1, 2, 3], [6, 7, 8]]) |
np.concatenate ((A, B), axis=1
)表示,要把数组A和B链接起来,并且维度是1,也就是列
删除
np.delete(x,place,axis)
:
x
:要删除元素的数组place
:删除的位置或索引axis
:指定按行或列删除
1 | A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) |
分割
在使用函数之前,使用python
自带的切片语法是最方便的:
1 | data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) |
data[a:b,c:d]
:切片的语法,其中a,b,c,d
代表了行和列的起始和终止的位置,也就是取[a,b)
行,[c,d)
列,注意是左闭右开的范围,如果a,c
省略,则默认是最开始的位置,b,d
省略了,这默认是最末尾的位置
例:
1 | data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) |
data[0:1,1:3]
表示的是:取[0,1)
行,切片第0行在数组表示中也就是第1行,取[1,3)
列,也就是第2,3列,那么结果是第1行的第2,3列的元素集合
data[:2,2:]
表示的是:取[0,2)
行,也就是数组的第1,2行,取[2,3)列,也就是第3列,那么结果是第1,2行和第3列的元素结合
c=data[:,0:1]
表示的是:取[0,3)
行,也就是所有行,0表示第1列,所以会取出第1列的所有元素
可以观察到,b和c都是二维数组,保留了其二维结构,如果我们想要取出列后,将其变成1维数组,那么可以省略后一个冒号:
以下是例子:
1 | data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) |
可以看到,在省略后一个冒号:
之后,提取出来的列变为了1维数组,更方便计算
np.split(x,place,axis)
:
x
:要分割的数组place
:分割的位置或份数axis
:指定分割的维度
1 | A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) |
np.split(A, 3, axis=0)
的意思是,按行分割,把数组切割成3份,形成3个新数组,并把数组装进一个列表B中
1 | A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) |
np.split(A, [1], axis=0)
的意思是,按行分割,在第1行和第2行之间切割,把数组分成了2部分,装入列表B中
也可以使用hsplit
函数切割横向,vsplit
函数切割纵向,这样就不用写第三个axis
参数了
统计函数
函数 | 说明 |
---|---|
np.sum(a, axis) | 根据给定轴axis计算数组a相关元素之和 |
np.mean(a, axis=None) | 根据给定轴axis计算数组a相关元素的算术平均值 |
np.average(a,axis=None,weights=None) | 根据给定轴axis计算数组a相关元素的加权平均值 |
np.std(a, axis=None) | 根据给定轴axis计算数组a相关元素的标准差 |
np.var(a, axis=None) | 根据给定轴axis计算数组a相关元素的方差 |
np.min(a) max(a) | 计算数组a中元素的最小值、最大值 |
np.ptp(a) | 计算数组a中元素最大值与最小值的差 |
np.median(a) | 计算数组a中元素的中位数(中值) |
np.unravel_index(index, shape) | 根据shape将一维下标index转换成多维下标 |
以下举例说明用法:
np.sum(a,axis)
:用于计算数组元素之和的函数
a
是要求和的数组,可以是一维或多维的axis
是指定求和的维度,可以是整数或元组,例如0
或(0,1)
1 | a = np.array([[1, 2, 3, 4], |
注意:numpy
中axis=1
指定的是行,而在Pandas
中,axis=1
指定的是列,两者截然相反
随机数函数
numpy中的随机数函数都是基于np.random的方法
函数 | 说明 |
---|---|
rand(d0,d1….dn) | 根据d0-dn的范围创建随机数数组,在0到1之间均匀分布 |
randn(d0,d1….dn) | 根据d0-dn的范围创建随机数数组,标准正态分布 |
seed(s) | 随机数种子,s是给定的种子值 |
print(np.random.randn(2,5))
的意思是生成一个2行5列的二维数组,每个元素都是一个服从标准正态分布的随机数。
1 | [[ 0.75238979 -0.05053056 -0.77662364 -1.4862594 0.55068062] |
补充一个numpy.random.choice(a, size=None, replace=True)
函数
a
:数据范围- 如果是数组,表示从中进行随机抽样。
- 如果是整数,表示范围是
[0, a)
。
size
: 输出的大小。如果是整数,表示输出的是一维数组,如果是元组,表示输出的是多维数组。replace
: 表示是否允许有放回地抽样。如果为True
,则允许重复抽样,如果为False
,则不允许重复抽样。
Matplotlib
简介
matplotlib
是一个Python
的绘图库,它可以用来创建各种类型的图表和可视化。它有很多功能和参数,可以让你自定义图形的样式和效果。它也可以和其他的Python
库如numpy
和scipy
一起使用,进行科学计算和数据分析。
Matplotlib
库由各种可视化类构成,内部结构复杂,受Matlab
启发,matplotlib.pyplot
是绘制各类可视化图形的命令子库,相当于快捷方式
import Matplotlib.pyplot as plt
plot函数
plot(x, y, format, data=None, **kwargs)
:是绘制二维图形的一个常用函数,它可以接受多种参数来控制图形的样式和效果
x
:表示X轴的数据,可以是列表,数组或者其他可迭代的对象y
:表示Y轴的数据,可以是列表,数组或者其他可迭代的对象format
:是一个可选的字符串,用来指定颜色,字符,标记等
字符串 | 说明 | 字符串 | 说明 |
---|---|---|---|
‘b’ | 蓝色 | ‘r’ | 红色 |
‘g’ | 绿色 | ‘y’ | 黄色 |
‘#008000’ | RGB颜色 | ‘0.8’ | 灰度值 |
‘-‘ | 实线 | ‘—‘ | 破折线 |
‘:’ | 虚线 | ‘’’’ | 无线条 |
‘.’ | 点标记 | ‘o’ | 实心圆 |
‘v’ | 倒三角 | ‘^’ | 上三角 |
data
:是一个可选的参数,用来传入一个对象数据类型,比如字典**kwargs
:是一些关键字参数,可以设置第二组或更多的(x,y,format)
,或者是用来设置图形的其他属性,比如标题,标签,刻度
如果plot
函数只有一个列表或数组输入,参数会被当做y
轴,x
轴以索引自动生成,也就是说,如果你输入一个数组$a=[a_0, a_1, a_2, …, a_n]$,那么plot
函数会绘制出n+1
个点,它们的坐标分别是$(0, a_0), (1, a_1), (2, a_2), …, (n, a_n)$。然后用线段连接这些点,形成一条曲线
1 | import Matplotlib.pyplot as plt |
输入多个数组会将两个相邻数组看做x,y轴的数据,从而绘制出曲线
1 | import Matplotlib.pyplot as plt |
实际上,我觉得这样写更好,虽然麻烦一些,但是可读性高:
1 | a=np.arange(10) |
文本显示
函数 | 说明 |
---|---|
plt.xlabel() | 对 X轴增加文本标签 |
plt.ylabel() | 对 Y轴增加文本标签 |
plt.title() | 对图形整体增加文本标签 |
plt.grid(bool) | True代表显示网格 |
plt.axis() | 规定坐标轴的起始范围 |
plt.legend() | 指定图例的位置和字体大小 |
这里注意,pyplot
默认是无法显示中文的,如果要用中文输出的话,增加一个属性:fontproperties
,后面的'SimHei'
表示用的是黑体
1 | a=np.arange(0,5.0,0.02) |
散点图
直接使用plt.scatter()
函数就可以绘制散点图,例:
1 | plt.scatter(10*np.random.randn(100),10*np.random.randn(100)) |
生成了100个服从正态分布的随机数,并放大10倍,同时参数为'o'
,即实心圆点
还有一种面向对象的散点图绘制方法:
1 | fig,ax=plt.subplots() |
一样可以绘制散点图,实际上,这种方法是官方推荐的办法,因为创建了plt
的对象,让操作更加方便
fig,ax=plt.subplots()
:
fig
是图形窗口对象,代表整个绘图区域,包括子图、图表标题、轴标签等ax
则是子图对象的一个列表,用于设置每个子图的属性和绘制图形subplots()
表示创建了一个子图
以下是一些子图对象ax
的绘制方法,plt
也能直接调用这些方法
方法 | 说明 |
---|---|
ax.plot | 曲线图 |
ax.bar | 柱状图 |
ax.pie | 饼状图 |
ax.scatter | 散点图 |
以散点图scatter
为例,解释一下绘制图形时的参数
ax.scatter(x, y, s=None, c=None, marker=None, cmap=None,data,**kwargs)
x
和y
是表示横纵坐标的数据,它们可以是列表、数组或其他可迭代的对象。s
是表示点的大小的参数,c
是表示点的颜色的参数,marker
是表示点的形状的参数,cmap
是表示颜色映射的参数,data
是表示传入对象数据类型的参数,**kwargs
是表示其他关键字参数
可以看到,可以调整的参数远比plot
函数多
1 | # 创建一个图形窗口和一个子图 |
这里设置标题的方法和plot
有所不同,不过差别很小
Pandas
简介
Pandas
是一个用于数据分析的 Python
库,它基于 NumPy
和 matplotlib
,提供了高效、易用的数据结构和数据处理工具
Pandas
的主要数据结构是Series
(一维数据)和 DataFrame
(二维数据),它们可以方便地对数据进行分组、聚合、合并、透视等操作
import pandas as pd
Series类型
定义
Series
类型由一组数据及与之相关的数据索引组成
使用方法和NumPy
的数组类似,不同之处在于,Series
会给数据生成一个索引
s = pd.Series(data, index, name=, dtype=)
data
:必要的参数,表示数据index
:可选的参数,表示数据的索引,默认是从0开始增加name
:可选的参数,表示Series
的名字dtype
:可选的参数,指定数据类型
1 | import pandas as pd |
a,b,c,d
就是指定的索引,如果不写,那么就是0,1,2,3
创建
Series
可以由多种数据类型创建,以下类型比较常见:
Python
列表:index
与列表元素个数一致
1 | import pandas as pd |
- 标量值:
index
表达Series
类型的尺寸
1 | import pandas as pd |
Python
字典:键是索引,值是数据
1 | data = {"a": 1, "b": 2, "c": 3, "d": 4} |
- 使用其他
Series
对象作为数据,可以指定索引标签,也可以使用原Series
对象的索引
1 | import pandas as pd |
属性
属性 | 说明 |
---|---|
index | 返回 Series 对象的索引,可以是字符串、数字或其他类型 |
values | 返回 Series 对象的数据,以 numpy 数组的形式 |
dtype | 返回 Series 对象的数据类型,可以是 int、float、str |
size | 回 Series 对象的个数 |
name | 返回 Series 对象的名称,可以自定义或默认为 None |
empty | 返回一个布尔值,表示 Series 对象是否为空 |
可以通过Series
对象的index
属性和values
属性直接输出Series
中的数据
1 | import pandas as pd |
Index索引
正如上面的代码,执行index
属性会返回Series
对象的索引类型,类型名称就叫Index
类型,Index
类型是一个无法修改的类型
index
索引有很多函数,方便直接修改索引
方法 | 说明 |
---|---|
.append(idx) | 连接另一个Index对象 |
.diff(idx) | 计算差集 |
.intersection(idx) | 计算交集 |
.union(idx) | 计算并集 |
.delete(loc) | 删除loc位置处的元素 |
.insert(loc,e) | 在loc位置增加一个元素e |
注意,由于index
无法修改,以上操作都会返回一个新的index
对象
1 | data = [1, 2, 3, 4] |
操作
不难看出,Series
对象本质上是ndarray
对象和Python
中自带的字典类型的结合体,所以ndarray
和字典能用的函数,Series
基本上都能使用
1 | data = [8, 9, 5, 4] |
都是经典的ndarray
数组操作,Series
对象一样适用
1 | data = [8, 9, 5, 4] |
DataFrame类型
定义
DataFrame
类型由共用相同索引的一组列组成
DataFrame
是一个表格型的数据类型,每列值类型可以不同,既有行索引,也有列索引
可以看到,DataFrame
类型类似于excel
格式,常用于表达二维数据,但可以表达多维数据
创建
- 可以从二维的
ndarray
对象来创建
1 | import pandas as pd |
可以看到,行索引和列索引都是自动生成的,是从0开始的整数
- 从一维的
ndarray
对象字典创建
1 | dt={'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([9,8,7,6],index=['a','b','c','d'])} |
可以看到,我们用index
指定了DataFrame
对象的行索引,系统会将字典的key
当做是列索引,同时,会自动对齐格式,如果有缺失的项,会用NaN
表示空
- 直接从列表类型的字典创建
1 | dl={'one':[1,2,3,4],'two':[9,8,7,6]} |
操作
定位
df.head(n)
方法:查看DataFrame
对象的前n
行,默认是前5行
df.tail(n)
方法:查看DataFrame
对象的最后n
行,默认是后5行
使用df.loc
方法和df.iloc
方法可以访问并修改DataFrame
中的任意行列数据
loc
是基于标签(label
)来选择数据,即行索引和列索引的名称。例如,df.loc[‘A’:‘C’, ‘c1’:‘c3’]
表示选择行索引为A到C(包含C),列索引为c1到c3(包含c3)的数据iloc
是基于位置(index
)来选择数据,即行索引和列索引的整数位置。例如,df.iloc[1:3, 2:4]
表示选择第1行到第3行(不包含第3行),第2列到第4列(不包含第4列)的数据
loc
和iloc
实现了ndarray
中的切片操作
1 | df = pd.DataFrame({'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'], |
df.loc['a2':'name']
:输出Bob
df.loc[:,'name','gender']
:会输出name
和gender
列的所有数据
df.loc['a1:'a3',:]
:会输出a1
到a3
列的所有数据
1 | """ |
df.iloc[0,2]
:会直接输出Charlie
df.iloc[:,[0,-1]]
:会输出第1列和最后一列,注意这里的-1
表示最后一列
df.iloc[0:3,:]
:会输出第1行到第3行
1 | """ |
以上就是如果定位到DataFrame对象中的数据,修改就不必多说了,因为能够定位,就能够修改,比如:
df.iloc[3,1:3]=('55','F','100')
执行该语句会将df
中的第4行的第2个数据到第4个数据依次改为55,F,100
插入
DataFrame.insert(loc,column,value)
用于在指定位置插入新列,它的主要参数如下:
loc
- 插入列的索引位置,从0开始column
- 新插入列的列名value
- 新插入列的值,可以是标量、列表、数组等
1 | import pandas as pd |
重新索引
df.reindex(index or columns fill_value,method,copy)
:
index or columns
:新的行列索引fill_value
:如果有缺失值的填充值,默认为NaN
method
: 填充缺失值的方法,ffill
当前值向前填充,bfill
向后填充copy
:默认为True
,生成新的对象,False
时,新旧相等不复制
1 | df = pd.DataFrame({'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'], |
其中a
就是df
交换了a1
,a2
两行所生成的新对象,b
是在a
的基础上交换了age
列和name
列所生成的新对象
reindex
可以通过改变Index
这一索引类型,从而实现简便的操作,而这也是Pandas
数据类型的核心思想
索引的增删
使用Index
索引的insert
和delete
方法可以实现索引的增加或者删除,这在Series
类型的Index
索引这一小节中有所提及
1 | df = pd.DataFrame({'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'], |
删除指定的行或者列,更推荐使用drop
方法
drop(name,axis)
name
:指要删除的行列名称axis
:要删除的轴,默认是删除行,如果要删除列,则修改为1
1 | df = pd.DataFrame({'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'], |
运算
算术运算是根据行列索引,补齐后运算,运算默认产生浮点数,补齐时缺项填充NaN
可以直接使用+-*/
进行运算,不过推荐使用算术方法
方法 | 说明 |
---|---|
.add(d,**argws) | 加 |
.sub(d,**argws) | 减 |
.mul(d,**argws) | 乘 |
.div(d,**argws) | 除 |
1 | import pandas as pd |
数据排序
sort_index(ascending,axis)
方法:按照索引(行或列)的顺序进行排序
ascending
:默认是升序排列True
,如果是降序排列,可改成asceding=False
axis
:默认是按行索引排序,如果要改成列索引,可改成axis=1
,被
1 | import pandas as pd |
sort_values(by=name,ascending)
,根据values
的值进行排序,默认是升序排列
by
:后面添加要排序的行列的名称ascending
:选择是升序还是降序
1 | df.sort_values(by='name', ascending=False) |
CSV文件
定义
CSV文件是一种存储和表示表格数据的纯文本文件,它的全称是逗号分隔值(Comma-Separated Values)
CSV文件的特点是每行代表一条记录,每个数据用逗号分隔,如果数据中含有逗号,就用引号包围。
保存
to_csv
是pandas
库中的一个方法,它可以将一个DataFrame
或Series
对象写入到一个csv
文件中,或者返回一个csv
格式的字符串
pd.to_csv(path,sep,na_rep,columns,header,index,index_label)
:
path
:这个参数指定了写入的目标,可以是一个文件路径,一个文件对象,或者Nonesep
:这个参数指定了字段之间的分隔符,默认是逗号(,)na_rep
:这个参数指定了缺失值的表示方式,默认是空字符串(‘’)。可以根据需要修改为其他字符串,例如’NA’或’NULL’columns
:这个参数指定了要写入的列,可以是一个列名的列表。如果不指定,那么会写入所有的列header
:这个参数指定了是否写入列名,可以是一个布尔值或者一个字符串的列表。如果是True,那么会写入默认的列名。如果是False,那么不会写入列名index
:这个参数指定了是否写入行索引,可以是一个布尔值。如果是True,那么会写入行索引。如果是False,那么不会写入行索引index_label
:这个参数指定了行索引的列名,可以是一个字符串或者一个字符串的列表。如果是None,那么会使用默认的行索引名。如果是False,那么不会写入行索引名
1 | import pandas as pd |
表示:将这个DataFrame
对象写入到一个csv
文件中,文件名是example.csv
,分隔符是逗号(,),缺失值表示为’NA
’,不写入行索引,但写入列名
最后会得到内容如下表的example.csv
文件
name | age | gender |
---|---|---|
Alice | 25 | F |
Bob | 30 | M |
Charlie | 35 | M |
读取
read_csv
是Pandas
库中的一个函数,它可以从一个文件或网址中读取逗号分隔值(csv)格式的数据,返回一个DataFrame
对象
pd.read_csv(path,sep,header,names,index_col,usecol,dtype)
path
:文件或网址的位置,可以是任何有效的字符串路径或URLsep
:分隔符,用来指定数据中的每个值之间的字符或正则表达式,默认为逗号,如果`sep=None
,会从第一行有效的数据中推断出分隔符header
:列号或列号的序列,用来指定包含列名的行和数据的开始位置,从0开始计数,默认把第一行看做列名names
:列名的列表或字典,用来自定义列名,如果传入了names
,那么header=None
,不使用文件中的任何行作为列名,如果传入了字典,那么键是列的索引,值是列的名称index_col
:行号或行号的序列,用来指定作为行索引的列,从0开始计数,如果为None
,那么没有行索引,只有默认的数字索引usecols
:列号或列名的列表,用来指定要读取的列,从0开始计数,可以传入一个函数来过滤列dtype
:数据类型,用来指定每列数据的类型,可以是一个类型
1 | df = pd.read_csv('example.csv', sep=',', header=None,name=['x','y'], index_col=None) |
表示:将这个csv
文件读取为一个DataFrame
对象,文件名是data.csv
,分隔符是逗号,不将第一行看做是列名,自定义列名为x
和y
,不使用任何列作为行索引
统计分析
Pandas
数据类型可以直接使用NumPy
中的统计函数
Pandas
自带了describe
()函数,可以很方便的展示信息
1 | import numpy as np |
count
: 非空值的数量,即有效的观测值的个数。mean
: 所有数值的平均值,即算术平均值。std
: 所有数值的标准差,即数据的离散程度。min
: 最小值,即数据的最低点。25%
: 第一四分位数,即数据的下四分位数,表示25%的数据低于或等于这个值。50%
: 第二四分位数,即数据的中位数,表示50%的数据低于或等于这个值。75%
: 第三四分位数,即数据的上四分位数,表示75%的数据低于或等于这个值。max
: 最大值,即数据的最高点。
相关性分析
方法 | 说明 |
---|---|
.cov() | 计算协方差矩阵 |
.corr(method,min_periods) | 计算相关系数矩阵 |
method
:相关性计算方法,可选值为’pearson
’(默认)、‘kendall
’和’spearman
’。
pearson
:表示使用皮尔逊相关系数衡量相关性,该系数是最常用的相关性度量,适用于线性相关的情况;kendall
:使用肯德尔相关系数衡量相关性,适合非线性但单调递增或递减的相关关系;spearman
:使用斯皮尔曼相关系数衡量相关性,也适用于非线性但单调递增或递减的相关关系。
min_periods
:计算相关系数所需的最小观测值数,即样本量,缺失值不计入样本量。
Plot绘图
Pandas
的plot
函数是一个用来绘制DataFrame
或Series
对象中的数据的方法,它可以根据不同的参数选择绘制的图形类型,如折线图、柱状图、饼图、散点图等,它也可以根据数据的索引和列名自动添加图例和标签,方便数据的可视化和分析。
可以说:Pandas
中的plot
函数是基于matplotlib
库的一个封装
DataFrame.plot(x=None, y=None, kind=‘line’, ax=None, layout=None, figsize=None,label=None, color=None,title=None, grid=None, legend=True)
x
和y
:表示标签或者位置的名称(必须),用来指定显示的索引,默认为None
kind
:表示绘图的类型,默认为line
,折线图,还可以选择其他类型,如柱状图bar
,直方图hist
,饼状图pie
,散点图scatter
等ax
:表示matplotlib
的子图对象,用来在同一个画布上绘制多个图形,默认为None
layout
:表示子图的行列布局,(rows
,columns
)的形式,默认为None
figsize
:表示图形的尺寸大小,(width
,height
)的形式,默认为None
label
:这个参数的值将作为图例中的标签color
:这个参数的值将决定图表的颜色title
:表示图形的标题,字符串类型,默认为None
grid
:表示是否显示网格线,默认为None
legend
:表示是否显示图例,默认为True
1 | x1 = 10*np.random.randn(50) |
这段代码的意思是在df中创建一个散点图,其中x1
是x轴,y1
是y轴,标题是'graph'
,图例的标签是'Group 1'
,并且显示网格和图例。这个图将显示df
中x1
和y1
列的数据分布
Pandas
和matplotlib
中的plot
函数比较
matplotlib | Pandas | |
---|---|---|
数据输入 | 可以接受各种格式的数据,包括列表、numpy数组、pandas对象等 | 必须是DataFrame或Series对象中的数据 |
灵活性 | 提供了更多的灵活性,可以让你更加精细地控制图形的各个方面 | 灵活性较低,但对于基本的图形创建非常方便 |
代码复杂性 | 代码可能会比较复杂,特别是对于复杂的图形 | 代码通常更简洁,特别是当数据已经存储在DataFrame中时 |
适用情况 | 当你需要对数据进行复杂的操作或者转换,或者需要精细地控制图形的各个方面时,matplotlib可能会更加方便 | 当你的数据已经存储在DataFrame中,且你需要创建基本的图形时,Pandas的plot函数可能会更加方便 |
总结
比如现在有一个名叫ex1data1.txt
的文件,里面有两列数据,要求绘制散点图
操作如下:
- 导入
NumPy
和Pandas
库
1 | import numpy as np |
- 利用
pd.read_csv()
函数读取文件
1 | df=pd.read_csv('ex1data1.txt',header=None,names=['x', 'y']) |
- 利用
df.plot()
函数绘制散点图
1 | df.plot(x='x',y='y,kind='scatter') |
这样就可以生成散点图