这是个人的一个学习后的笔记总结,可能有不好的地方,希望大家多提提意见
一、Numpy库
ndarray对象
NumPy 最重要的一个对象是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,可以使用基于 0 的索引访问集合中的项目。
创建ndarray数组格式:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
- object数组或者嵌套的数列
- dtype数组类型,可选
- copy表示对象是否需要复制,可选
- order创建数组样式C(按行)、F(按列)或A(任意,默认)
- subok默认情况下,返回的数组被强制为基类数组。 如果为true,则返回子类
- ndmin指定返回数组的最小唯独
一般情况下使用最多的是object、dtype和ndmin
示例1:
创建一维数据
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9])
print(a)
输出结果
[1 2 3 4 5 6 7 8 9]
示例2:
创建二维数据
import numpy as np
b = np.array([[1,2,3],[2,3,4]]) #创建二维数据
print(b)
输出结果
[[1 2 3]
[2 3 4]]
示例3:
指定数据的数据类型
c = np.array([1,2,3],dtype=float) #指定数据
print(c)
输出结果
[1. 2. 3.]
np数据类型
序号 | 数据类型及描述 |
---|---|
1. | bool_ 存储为一个字节的布尔值(真或假) |
2. | int_ 默认整数,相当于 C 的long ,通常为int32 或int64 |
3. | intc 相当于 C 的int ,通常为int32 或int64 |
4. | intp 用于索引的整数,相当于 C 的size_t ,通常为int32 或int64 |
5. | int8 字节(-128 ~ 127) |
6. | int16 16 位整数(-32768 ~ 32767) |
7. | int32 32 位整数(-2147483648 ~ 2147483647) |
8. | int64 64 位整数(-9223372036854775808 ~ 9223372036854775807) |
9. | uint8 8 位无符号整数(0 ~ 255) |
10. | uint16 16 位无符号整数(0 ~ 65535) |
11. | uint32 32 位无符号整数(0 ~ 4294967295) |
12. | uint64 64 位无符号整数(0 ~ 18446744073709551615) |
13. | float_ float64 的简写 |
14. | float16 半精度浮点:符号位,5 位指数,10 位尾数 |
15. | float32 单精度浮点:符号位,8 位指数,23 位尾数 |
16. | float64 双精度浮点:符号位,11 位指数,52 位尾数 |
17. | complex_ complex128 的简写 |
18. | complex64 复数,由两个 32 位浮点表示(实部和虚部) |
19. | complex128 复数,由两个 64 位浮点表示(实部和虚部) |
设置数据类型示例
设置数组x数据类型为负数类型
import numpy as np
x = np.array([1,2,3],dtype=np.complex)
print(x)
输出结果
[1.+0.j 2.+0.j 3.+0.j]
ndarray对象的属性
属性 | 说明 |
---|---|
ndarray.ndim | 秩,即轴的数量或维度的数量 |
ndarray.shape | 数组的维度,对于矩形,n行m列 |
ndarray.size | 数组元素的总个数,相当于.shape中n*m的列 |
ndarray.dtype | ndarray对象的元素类型 |
ndarray.itemsize | ndarray对象中每个元素的大小,以字节为单位 |
ndarray.flags | ndarray对象的内存信息 |
ndarray.real | ndarray元素的实部 |
ndarray.image | ndarray元素的虚部 |
ndarray.data | 数组元素的缓冲区,一般用不到 |
示例
import numpy as np
x = np.array([[1,2,5,3],[2,3,5,6]],dtype=np.int16)
# print(x)
print(x.size)
print(x.ndim)
print(x.shape)
print(x.dtype)
print(x.itemsize)
print(x.data)
输出结果
8
2
(2, 4)
int16
2
<memory at 0x06F85B70>
创建ndarray数组
(1)、从python结构(例如:列表、元祖)转换
格式:x = numpy.array(list/tuple)
带数据类型:x=numpy.array(list/tuple, dtype=np.float32)
当numpy.array()不指定dtype时,NumPy将根据数据情况关联一个dtype类型
(2)、使用NumPy中函数创建ndarray数组,例如,arange、ones、zeros等
arange格式
arange([start,] stop[, step,], dtype=None)
start是开始的数字、stop是终止数字,step是步长,dtype是None。取值是左闭右开
示例:
import numpy as np
a = np.arange(3)
b = np.arange(1,3)
c = np.arange(3,7,2)
print(a)
print(b)
print(c)
输出结果:
[0 1 2]
[1 2]
[3 5]
ones格式
ones(shape, dtype=None)
shape返回的数组维度,dtype指定数组元素类型。这里默认放回的是浮点型
示例:
import numpy as np
a = np.ones(5)
b = np.ones([2,3],dtype=int)
print(a)
print(b)
输出结果:
[1. 1. 1. 1. 1.]
[[1 1 1]
[1 1 1]]
zeros格式
zeros(shape, dtype=None)
shape返回的数组维度,dtype指定数组元素类型。这里默认放回的是浮点型
示例:
import numpy as np
a = np.zeros(5)
b = np.zeros([2,3],dtype=int)
print(a)
print(b)
输出结果
[0. 0. 0. 0. 0.]
[[0 0 0]
[0 0 0]]
处理以上函数还有很多
如:
import numpy as np
np.empty(shape, dtype=None) # 根据维度shape生成一个随机元祖
np.full(shape, fill_value) # 根据shape生成一个数组,每个元素值都是val
np.eye(n) # 创建一个正方的n*n单位矩阵,对角线为1,其余为0
np.linspace(start, stop, num=50)#指定元素数量的均匀递增数组
np.zeros_like(a) # 返回具有与给定数组相同的形状和类型的零数组
np.ones_like(a) # 返回具有与给定数组相同的形状和类型的1数组
np.empty_like(prototype) # 回具有与给定数组相同的形状和类型的新随机数组
(3)、从随机函数创建
随机生成数组需要考虑的因素:
- 数据范围:区间,整数、小数
- 数据分布:均匀分布、正态分布、指定分布
- 数据形状:size
常用的随机函数
函数 | 解释 |
---|---|
rand(d0,d1,…) | [0,1]均匀分布 |
randint(low,high,size) | [low,high)整数均匀分布 |
choice(a,size,replace,p) | 指定数组指定概率分布 |
randn(d0,d1,…) | 标准正态分布 |
示例:
均匀分布
import numpy as np
a = np.random.rand(2,3)
print(a)
输出结果
[[0.38268359 0.94986424 0.3964916 ]
[0.22080613 0.43691959 0.39960606]]
整数均匀分布
import numpy as np
a = np.random.randint(4,size=(2,3))
print(a)
输出结果
[[3 0 2]
[3 0 3]]
ndarray方法
import numpy as np
a = np.array([[1,2,3,4,3,4,5,2,32,3,2,4]],dtype=int)
a.astype(float) #更改数据类型
a.reshape([3,4]) #更改数据形状
a.resize((2,6)) #修改原数组形状,在原先的数组上改变
# a.swapaxes(ax1,ax2)将数组n个维度中两个维度进行调换
a.flatten() #对数组进行降维,返回折叠后的一维数组,原数组不变
b = a.tolist() #是将ndarray数组转换成列表
数据的切片
数据的切片与python列表的切片类似
一位数组的切片
import numpy as np
a = np.array([1,2,3,4,5])
print(a)
print(a[2]) #3
print(a[0:3:1]) #[1 2 3]
结果:
[1 2 3 4 5]
3
[1 2 3]
多维数组
import numpy as np
a = np.arange(24).reshape((2,3,4))
print(a)
print(a[0,2,3]) #11
print(a[1,0:2,1]) #[13,17]
print(a[0,1,:]) # [4 5 6 7]
结果:
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
11
[13 17]
[4 5 6 7]
Numpy一元函数
函数 | 说明 |
---|---|
np.abs(x)/np.fabs(x) | 计算数组元素绝对值 |
np.mean(x) | 求平均值 |
np.sqrt(x) | 计算各元素的平方根 |
np.square(x) | 计算各元素的平方 |
np.log(x) / np.log10(x) / np.log2(x) | 计算数组各元素的自然对数、10底对数和2底对数 |
np.ceil(x) / np.floor(x) | 计算大于等于该值得最小整数和小于等于该值的最大整数 |
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(0)、-1(负) |
np.isnan(ndarray) | 返回一个判断是否是NaN的bool型数组 |
示例:
import numpy as np
a = np.array([-3, -2, -1, 0, 1, 2, 3, 4, 5])
print(np.mean(a))
输出结果
1.0
Numpy二元函数
函数 | 说明 |
---|---|
+ - * / | 数组各元素进行相对应的加减乘除运算 |
np.maximum(x,y)/np.fmax(x,y) np.minimum(x,y) np.fmin(x,y) | 数组元素对应的最大值和最小值计算,fmax和fmin忽略Nan |
np.mod(x,y) | 数组元素对应的模运算 |
np.copysign(x,y) | 将数组y中各元素值的符号赋值给数组x对应元素 |
np.multiply(x,y) | 数组元素对应的相乘运算 |
np.power(x,y) | 数组元素对应的x的y次方 |
>、<、>=、<=、==、!= | 数组各元素进行算术比较,结果参数布尔型数组 |
示例:
import numpy as np
a = np.array([-3, -2, -1, 0, 1, 2, 3, 4, 5])
b = np.array([4, 6, 5, 1, 2, 3, 5, 3, 2])
print(a > b)
print(np.maximum(a, b))
输出结果
[False False False False False False False True True]
[4 6 5 1 2 3 5 4 5]
csv文件存取
数据存为csv文件
格式:
np.savetxt(frame, array, fmt='%.18e', delimiter=None)
frame
: 文件、字符串或产生器,可以是.gz或.bz2的压缩文件array
: 存入文件的数组fmt
: 写入文件的格式,例如:%d %.2f %.18edelimiter
: 分割字符串,默认是任何空格
示例
a = np.array([-3, -2, -1, 0, 1, 2, 3, 4, 5])
np.savetxt('a.csv',a,fmt="%d",delimiter=",")
读取csv文件
np.loadtxt(frame, dtype=np.float, delimiter=None,unpack=False)
frame
: 文件、字符串或产生器,可以是.gz或.bz2的压缩文件dtype
: 数据类型,可选delimiter
: 分割字符串,默认是任何空格unpack
: 如果True,读入属性将分别写入不同变量
示例
a = np.loadtxt('a.csv',dtype=np.float,delimiter=",",unpack=False)
print(a)
保存为csv只能是一维数组和二维数组
存为外部文件时制定的分隔符和读文件指定的分隔符要一致
否则读时就不要指定分隔符,使用默认的
多维数据的存取
存储
a.tofile(frame, sep='', format='%s')
frame
: 文件、字符串sep
: 数据分割字符串,如果是空串,写入文件为二进制format
: 写入数据的格式
示例
a = np.arange(50).reshape(5,5,2)
a.tofile("a.data",sep=",",format="%d")
读取
np.fromfile(frame, dtype=np.float, count=‐1, sep='')
frame
: 文件、字符串dtype
: 读取的数据类型count
: 读入元素个数,‐1表示读入整个文件sep
: 数据分割字符串,如果是空串,写入文件为二进制
示例
a = np.fromfile("a.bat", dtype=np.int, count=-1, sep=",")
print(a)
NumPy的便捷文件存取
保存为外部文件
np.save(fname,array) 或者 np.savez(fname,array)
fname
: 文件名,以.npy为扩展名,压缩扩展名为.npzarray
: 数组变量
读取为外部文件
np.load(fname)
fname
: 文件名、以.npy为扩展名,压缩扩展名为.npz
NumPy的统计函数(1)
函数 | 说明 |
---|---|
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相关的方差 |
axis=None 是统计函数的标配参数
NumPy的统计函数(2)
函数 | 说明 |
---|---|
min(a) max(a) | 计算数组a中元素最小值、最大值 |
argmin(a) argmax(a) | 计算数组a中元素最小值、最大值的降一维后的下标 |
unravel_index(index,shape) | 根据shape将一维下标index转换成多维下标 |
ptp(a) | 计算数组a中元素最大值与最小值的差 |
median(a) | 计算数组a中元素的中位数(中值) |
二、Pandas库
Pandas 基于NumPy包构建,Pandas中使用了很多NumPy的数据结构,这些数据结构在很多Python数据科学工具包中都是通用的。Pandas的数据可用于SciPy中的统计分析,Matplotlib中的函数绘图,Scikit-learn中的机器学习算法。
Pandas的两个主要数据结构是Series和DataFrame。
DataFrame可以理解为一张表,Series就是其中的一个列。
series数据定义
Series类型可以由如下类型创建
-
Python列表:index与列表元素个数一致
-
标量值:index表达Series类型的尺寸
-
Python字典:键值对中的“键”是索引,index从字典中进行选择操作
-
ndarray:索引和数据都可以通过ndarray类型创建
-
其他函数:range()函数等
示例:
import pandas as pd
a = pd.Series([1, 2, 3, 4, 5]) # 列表创建
b = pd.Series([4, 5, 6, 7, 8], index=[1, 2, 3, 4, 5]) # 指定索引值
c = pd.Series({"a": 1, "b": 2}) # 用字典创建,key是索引,value是值
print(a)
print("-" * 10)
print(b)
print("-" * 10)
print(c)
输出结果
0 1
1 2
2 3
3 4
4 5
dtype: int64
----------
1 4
2 5
3 6
4 7
5 8
dtype: int64
----------
a 1
b 2
dtype: int64
Series定位元素
Series类型包括index和values两部分,他的操作类似于ndarray类型和python字典类型
Series的元素定位使用[],这里可以使用自定义的索引也可以使用元素位置索引进行定位
示例:
import pandas as pd
b = pd.Series([4, 5, 6, ], index=["a", "b", "c"])
print(b["a"])
print(b["c"])
print(b[1])
print(b[2])
输出结果
4
6
5
6
注意:自动索引和自定义索引不能一起并存
Series切片
可以通过自定义索引的列表进行切片,也可以通过自动索引进行切片,如果存在自定义索引,则一同被切片。
示例
import pandas as pd
b = pd.Series([4, 5, 6, 7, 8], index=["a", "b", "c", "d", "e"])
print(b[0:3])
print("-"*10)
print(b["a":"b"])
输出结果
a 4
b 5
c 6
dtype: int64
----------
a 4
b 5
dtype: int64
注意:自动索引和自定义索引不能一起并存
Series类型的基本操作
Series类型的操作类似Python字典类型:
- 通过自定义索引方位
- 保留字典操作
- 使用.get()方法
- 两组数据进行运算,他是基于索引进行运算的,只会将两组有相同的索引的进行运算,如果没有相同的索引输出的是NaN
示例
import pandas as pd
a = pd.Series([4, 5, 6, 7, 8], index=["a", "b", "c", "d", "e"])
b = pd.Series([1, 2, 3, 4, 5], index=[1, "b", "c", "d", 3])
# 使用字典操作进行操作数据
print(a.get("b"))
print(a.get(7,100))
print("-"*10)
print(a+b)
print("-"*10)
a.name = "数据a"
print(a)
输出结果
5
100
----------
1 NaN
3 NaN
a NaN
b 7.0
c 9.0
d 11.0
e NaN
dtype: float64
----------
a 4
b 5
c 6
d 7
e 8
Name: 数据a, dtype: int64
DataFrame数据
DataFrame是一个表格型的数据类型,每列值类型可以不同
DataFrame既有行索引、也有列索引
DataFrame常用于表达二维数据,但可以表达多维数据
DataFrame类型可以由如下类型创建:
- 二维ndarray对象
- 由一维ndarray、列表、字典、元组或Series构成的字典
- Series类型
- 其他的DataFrame类型
示例1
通过字典进行创建
import pandas as pd
data = {
'apples': [3, 2, 0, 1],
'oranges': [0, 3, 7, 2]
}
a = pd.DataFrame(data)
print(a)
输出
apples oranges
0 3 0
1 2 3
2 0 7
3 1 2
示例2:
指定行索引,如果不指定,默认是从0开始的索引
import pandas as pd
data = {
'apples': [3, 2, 0, 1],
'oranges': [0, 3, 7, 2]
}
a = pd.DataFrame(data, index=['June', 'Robert', 'Lily', 'David'])
print(a)
输出
apples oranges
June 3 0
Robert 2 3
Lily 0 7
David 1 2
示例3:
指定行索引(index)和列索引(columns)
import pandas as pd
a = pd.DataFrame([[1, 2, 3, 4], [5, 4, 3, 5]],index=[1,2],columns=[1,2,3,4])
print(a)
输出
1 2 3 4
1 1 2 3 4
2 5 4 3 5
示例5:
dt = {"one": pd.Series([1, 2, 3], ["a", "b", "c"]), "two": pd.Series([8, 2, 4, 6], ["a", "b", "c", "d"])}
d = pd.DataFrame(dt, index=["a", "c", "f"], columns=["two", "three"])
print(d)
输出
two three
a 8.0 NaN
c 4.0 NaN
f NaN NaN
他会通过创建时给点行列值去字典里去匹配,如果匹配的到就继续补齐,要是在字典里不存在就给NaN进行补齐
DataFrame的定位数据
.index
是输出所有行索引.columns
是输出所有列索引.values
是输出所有的数据,每一行数据成一个列表- 通过[]定位数据,第一个[]表示列索引,第二个[]表示行索引
示例
import pandas as pd
dl = {"城市": ["北京", "上海", "广州", "深圳", "沈阳"],
"环比": [102.3, 103.2, 234, 543, 543],
"同比": [454.3, 165.2, 453, 433, 332],
"定基": [143.3, 342, 53, 3243, 432]}
d = pd.DataFrame(dl, index=["c1", "c2", "c3", "c4", "c5"])
# print(d)
# print(d.index) #输出行索引
# print(d.columns) #输出列索引
# print(d.values) #输出所有数据,每一行数据成一个列表
print(d["城市"])
print("-"*10)
print(d["环比"]["c2"])
print("-"*10)
print(d["定基"]["c1":"c3"])
输出
c1 北京
c2 上海
c3 广州
c4 深圳
c5 沈阳
Name: 城市, dtype: object
----------
103.2
----------
c1 143.3
c2 342.0
c3 53.0
Name: 定基, dtype: float64
重新排序索引
这些方法可用在Series中和DataFrame中
.reindex(index=None,columns=None,...)
index, columns 新的行列自定义索引
fill_value 重新索引中,用于填充缺失位置的值
method 填充方法, ffill当前值向前填充,bfill向后填充
limit 最大填充量
copy 默认True,生成新的对象,False时,新旧相等不复制
示例
import pandas as pd
dl = {"城市": ["北京", "上海", "广州", "深圳", "沈阳"],
"环比": [102.3, 103.2, 234, 543, 543],
"同比": [454.3, 165.2, 453, 433, 332],
"定基": [143.3, 342, 53, 3243, 432]}
d = pd.DataFrame(dl, index=["c1", "c2", "c3", "c4", "c5"])
a = d.reindex(index=["c1", "c3", "c2", "c5", "c4"])
print(a)
输出
城市 环比 同比 定基
c1 北京 102.3 454.3 143.3
c3 广州 234.0 453.0 53.0
c2 上海 103.2 165.2 342.0
c5 沈阳 543.0 332.0 432.0
c4 深圳 543.0 433.0 3243.0
索引类型的常用方法
.append(idx) 连接另一个Index对象,产生新的Index对象
.diff(idx) 计算差集,产生新的Index对象
.intersection(idx) 计算交集
.union(idx) 计算并集
.delete(loc) 删除loc位置处的元素
.insert(loc,e) 在loc位置增加一个元素e
算术运算法则
算术运算根据行列索引,补齐后运算,运算默认产生浮点数
补齐时缺项填充NaN (空值)
二维和一维、一维和零维间为广播运算
采用+ ‐ * /符号进行的二元运算产生新的对象
方法形式的运算:
.add(d, **argws) 类型间加法运算,可选参数
.sub(d, **argws) 类型间减法运算,可选参数
.mul(d, **argws) 类型间乘法运算,可选参数
.div(d, **argws) 类型间除法运算,可选参数
示例
import pandas as pd
import numpy as np
a = pd.DataFrame(np.arange(20).reshape(4, 5))
b = pd.DataFrame(np.arange(20, 0, -1).reshape(4, 5))
c = b.add(a)
print(c)
输出
0 1 2 3 4
0 20 20 20 20 20
1 20 20 20 20 20
2 20 20 20 20 20
3 20 20 20 20 20
pandas读取外部文件
使用read_table来读取文本文件**(这里的table可以是csv或者excel等等)**
pandas.read_table(filepath_or_buffer, sep=’\t’, header=’infer’, names=None,
index_col=None, dtype=None, engine=None, nrows=None)
参数说明:
filepath 接收string。表示文件路径。无默认
sep 接收string。代表分隔符。read_csv默认为",",read_table默认为制表符"Tab"
header 接收int或者sequence。表示将某行数据作为列名。默认为infet,表示自动识别
names 接收array。表示列名。默认为None
index_col 接收int、sequence或false。表示索引列的位置,取值为sequence这代表多重索引,默认为None
dtype 接收dict。代表写入的数据类型(列名为key,数据格式为values).默认为None
nrows 接收int。表示读取前几行
也可以在括号中加上encoding指定数据类型
示例1
读取csv文件
df = pd.read_csv('purchases.csv')
df = pd.read_csv('purchases.csv', index_col=0) #指定第一列为索引
示例2
读取json数据
Json文件的内容:
{
"apples": {
"June": 3,
"Robert": 2,
"Lily": 0,
"David": 1
},
"oranges": {
"June": 0,
"Robert": 3,
"Lily": 7,
"David": 2
}
}
使用Pandas加载Json文件
df = pd.read_json('purchases.json')
df
输出
apples oranges
David 1 2
June 3 0
Lily 0 7
Robert 2 3
示例3
读取sql数据
import sqlite3
con = sqlite3.connect("database.db")
df = pd.read_sql_query("SELECT * FROM purchases", con)
df
输出
index apples oranges
0 David 1 2
1 June 3 0
2 Lily 0 7
3 Robert 2 3
就像CSV一样,我们可以通过传递index_col='index'
,来设置索引:
df = df.set_index('index')
df
复制
apples oranges
index
David 1 2
June 3 0
Lily 0 7
Robert 2 3
Pandas DataFrame存储到CSV, JSON,SQL
有时需要存储DataFrame到文件中,可以把DataFrame存储到CSV, JSON,SQL数据库中,如下所示:
df.to_csv('new_purchases.csv')
df.to_json('new_purchases.json')
# 保存到SQL数据库
import sqlite3
con = sqlite3.connect("database.db")
df.to_sql('new_purchases', con)
当保存为JSON和CSV文件时,只需指定适当的文件名。使用SQL,不是创建一个新文件,而是使用con
数据库连接将一个新表插入数据库。
Pandas 常用方法
.head(num)
打印前几行数据
.tail(num)
打印倒数几行数据
.info
可以查看数据集的基本信息
.shape
表示DataFrame的形状(行、列)
pandas库的排序
1、在指定轴上根据索引进行排序,默认升序
.sort_index(axis=0,ascending=True)
axis是指定的轴,0是index,1是colums
ascending是表示升序,默认为True,当为false时是代表降序
2、在指定轴上根据数值进行排序,默认升序
Series.sort_values(axis=0,ascending=True)
DataFrame.sort_values(by,axis=0,ascending=True)
by:axis轴上的某个索引或索引列表
示例:
c = b.sort_values(2,axis=0,ascending=False) #是对应列索引的2轴进行降序排序
c = b.sort_values("a",axis=1,ascending=False) #是根据行索引的a进行排序
在进行平排序时如果遇到NaN值会统一将NaN值放到最后
基本统计分析函数
1、适用于Series和DataFrame类型
.sum()
计算数据的总和,按0轴计算
.count()
非NaN值的数量
.mean() .median()
计算数据的算术平均值、算术中位数
.var() .std()
计算数据的方差、标准值
.min() .max()
计算数据的最小值、最大值
2、适用于Series类型
.argmin() .argmax()
计算数据最大值。最小值所在位置的索引位置(自动索引)
.idxmin() .idxmax()
计算数据最大值。最小值所在位置的索引(自定义索引)
3、适用于Series和DataFrame类型
.describe()
针对0轴(各列)的统计汇总
pandas去除重复项
.drop_duplicate(subset=None, keep='first', inplace=False)
subset
列的标签,或者传入一个标签列表,subset=[‘a’,‘b’]这种,只有指定列都重复的时候才会删除keep
选择需要保留的重复值,有三个选项, first:保留第一次出现的行, last:保留最后一次出现的行,False:全删掉inplace
传入布尔值,执行删除后,是否把结果赋值给原变量。比如df.drop_duplicates()之后,你可以选择将结果赋值给新的变量data=df.drop_duplicates(),也可以通过inplace参数,df.drop_duplicates(inplace=True),自动将结果赋值给df。
示例
temp_df.drop_duplicates(inplace=True)
temp_df.drop_duplicates(inplace=True, keep=False)
pandas删除null值
.isnull()
检测null值,返回的是布尔值,可以使用sum()方法来统计每一列的空值数
.dropna(axis=0)
删除出现空值项的行,axis=1指轴1,即列,轴0是行,还有一个参数how=“any”,默认是只要有缺失值就删除整行或者列,如果how='all’时,是当整行是空值是才会执行删除
示例
import pandas as pd
import numpy as np
a = pd.DataFrame({"id": np.arange(1, 11),
"age": np.array([12, 34, 21, 32, np.NaN, 31, np.NaN, 3, 1, 2])})
# print(a.isnull().sum())
a = a.dropna()
print(a)
输出
id age
0 1 12.0
1 2 34.0
2 3 21.0
3 4 32.0
5 6 31.0
7 8 3.0
8 9 1.0
9 10 2.0
Pandas填充空值
填充空值可以使用平均值或者指定某一个值将空值给填充上,填充空值使用.fillna()
函数
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
功能:使用字典的方法填充NA/Nan值
参数:
value
变量、字典、Series、DataFrame,用于填充缺失值method
{‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, 默认值 None ; 在Series中使用方法填充空白(‘backfill’, ‘bfill’向前填充,‘pad’, ‘ffill’向后填充)axis
{0 or ‘index’, 1 or ‘columns’}
示例
import pandas as pd
import numpy as np
a = pd.DataFrame({"id": np.arange(1, 11),
"age": np.array([12, 34, 21, 32, np.NaN, 31, np.NaN, 3, 1, 2])})
print(a.isnull().sum())
输出
id 0
age 2
dtype: int64
获取平均值
a_mean = a.mean()
print(a_mean)
输出
id 5.5
age 17.0
dtype: float64
用平均值替换空值
a.fillna(a_mean, inplace=True)
print(a)
输出
id age
0 1 12.0
1 2 34.0
2 3 21.0
3 4 32.0
4 5 17.0
5 6 31.0
6 7 17.0
7 8 3.0
8 9 1.0
9 10 2.0
Pandas可视化
Pandas的另一个优点是与Matplotlib的集成,可以直接绘制DataFrame和Series。
示例1
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
s = pd.Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
s.plot()
plt.show()
示例2
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.randn(10, 4).cumsum(0),
columns=['A', 'B', 'C', 'D'],
index=np.arange(0, 100, 10))
df.plot()
plt.show()
三、Matplotlib库
绘图时常用的功能
plt.ylabel()
是y轴的标签
plt.xlabel()
是x轴的标签
plt.savefig()
将输出图形存储为文件,默认PNG格式,可以通过dpi修改输出质量
plt.plot(x,y)
当有两个以上参数时,按照X轴和Y轴顺序绘制数据点
plt.axis([x1,x2,y1,y1])
是表示x轴和y轴的取值范围
plt.legend()
是用来显示图例的,当图里有图例label,必须调用
plt.show()
使用来显示图形的
plt.title()
对图形整体增加文本标签(显示在图形正上方)
plt.text()
在任意位置增加文本
plt.annotate()
在图形中增加带箭头的注解
plt.grid(True)
是显示网格线
示例
import matplotlib.pyplot as plt
plt.plot([3,4,5,4,3])
plt.savefig(r"C:\Users\Administrator\Desktop\text",dpi=600) #PNG文件
plt.show()
绘制线图
线图使用的是plt.plot()
来进行绘制
线图是最简单的图形,它一般表示y=f(x)这样中函数关系,给定一组x的值,得到一组y的值,一次画出各个点,再把他们连接在一起就成了一个线图了
plt.plot(x, y, format_string, **kwargs)
x和y是代表各轴的值
format_string: 控制曲线的格式字符串,由颜色字符、风格字符和标记字符组成,可选
**kwargs: 第二组或更多(x,y,format_string)
颜色字符: | 风格字符: | 标记字符 |
---|---|---|
b 蓝色 g 绿色 r 红色 c 青绿色 cyan m 洋红色 magenta y 黄色 k 黑色 w 白色 #008000 RGB某颜色 0.8 灰度值字符串 | - 实线 —— 破折线 -. 点划线 : 虚线 ’’ ‘’ 无线条 | . 点标记 , 像素标记(极小点) o 实心圆标记 v 倒三角标记 ^ 上三角标记 > 右三角标记 < 左三角标记 1 下花三角标记 2 上花三角标记 3 左花三角标记 4 右花三角标记 s 实心方形标记 p 实心五角标记 * 星形标记 h 坚六边形标记 H 横六边形标记 + 十字标记 x x标记 D 菱形标记 d 瘦菱形标记 垂直线标记 |
示例1
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 1, 10) # 利用numpy得到0到1之间的10位数
y = x # 将x赋值给y
plt.plot(x, y, label="y=x") # 利用.plot并且给定x和y轴的值,在给定label图例
plt.legend() # 这个是用来显示图例的,没这个显示不了y=x
plt.show() # 展示图形
示例2
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(10)
plt.plot(a,a*1.5,'go-',a,a*2.5,'b:h')
plt.show()
除了用上面方法显示线的样式外,还可以使用下面方法
color
: 控制颜色, color=‘green’
linestyle
: 线条风格, linestyle=‘dashed’
marker
: 标记风格, marker=‘o’
markerfacecolor
: 标记颜色, markerfacecolor=‘blue’
markersize
: 标记尺寸, markersize=20
示例3
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(1,10,10)
plt.plot(x,x*2,color="green")
plt.show()
子图绘制
plt.subplot(nrows, ncols, plot_number)
nrows 是表示行数
ncols 是表示列数
plot_number 是表示当前绘图的位置
例如:创建一个1行两列的区域,并且在第一个位置上绘制图:plt.subplot(1, 2, 1)
示例1
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(1,10,10)
plt.subplot(1,2,1)
plt.plot(x,x*2,label="y=x*2")
plt.legend()
plt.subplot(1,2,2)
plt.plot(x,x*5,label="y=x*5")
plt.legend()
plt.show()
如果在subplot中加上projection='polar’就会将图形改变成圆形状的
如:
plt.subplot(3,3,8,projection=‘polar’)
pyplot的中文显示
第一种方法:
pyplot的中文显示的第一种方法:
pyplot并不默认支持中文显示,需要rcParams
修改字体实现
rcParams的缺点就是定义的是整个图里面的字体样式,如果不想整个显示,就使用第二种方法
如:
import matplotlib
matplotlib.rcParams['font.family']='SimHei' #SimHei是表示黑体
属性
属性 | 中文字体种类 |
---|---|
``‘font.family’用于显示字体的名字<br/> ‘font.style’字体风格,正常'normal'或 斜体'italic'<br/> 'font.size’字体大小,整数字号或者'large'、'x‐small' | rcParams[‘font.family’]<br/> SimHei中文黑体<br/> Kaiti中文楷体<br/> LiSu中文隶书<br/> FangSong中文仿宋<br/> YouYuan中文幼圆<br/> STSong` 华文宋体 |
示例1
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
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
和fontsize
fontproperties
表示字体
fontsize
表示字体大小
示例2
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(0.0,5.0,0.02)
plt.xlabel("横轴:时间",fontproperties='SimHei',fontsize=20)
plt.ylabel("众轴:振幅",fontproperties='SimHei',fontsize=10)
plt.plot(a,np.cos(2*np.pi*a),'r--')
plt.show()
复杂的子图绘制区域
plt.subplot2grid(GridSpec, CurSpec, colspan=1, rowspan=1)
GridSpec
表示的是创建的图形他的行和列,如3行3列(3,3)
CurSpec
表示的是我们当前要绘制的位置的行和列的索引。如:第一行第二例(0,1)
colspan
表示的是占用该列的列数。如我们占用的是两列,colspan=2。这里表示的是第一行和第二行的第一列
rowspan
表示的是占用该行的列数。如我们占用的是两行,rowspan=2。这里表示的是第一列和第二列的第一行
示例
plt.subplot2grid((3,3),(1,0),colspan=2)
第一个参数是生成一个三行三列的图
第二个参数在第二行第一列的位置
第三个参数是我们占用的列为两列
绘制拼图
饼图是用表示百分比数据可视化的
拼图是用的是plt.pie()
来进行绘制
示例1
import matplotlib.pyplot as plt
plt.pie([1, 2], labels=['A', 'B'], autopct="%0.1f%%")
# plt.legend()
plt.show()
- 这里的plt.pie是指这个图像是拼图的,里面的[1,2]是指的是比例为1/3,2/3,如果是[2,4]就是指2/6,4/6。
- labels=[‘A’,‘B’]是指每个值对应的图例,他会在对应的扇形上指出来,如果在加上plt.legend()就会在叫了多一个图例
- autopct="%0.1f%%",是指每个数的格式化,%0.1f是指保留小数点一位数,%%是用来显示一个%号
控制饼图颜色:
控制饼图颜色在plt.pie()中多写一个配置colors=[],在这里面写着对应的扇形颜色的小写首字母,也可以是全写
如:colors=[“r”,“y”]
示例2
import matplotlib.pyplot as plt
plt.pie([1,2],labels=['A','B'],colors=["y","r"],autopct="%0.1f%%")
plt.legend()
plt.show()
绘制散点图
散点图是用来表示平面上(x,y)对数据的分布状况
散点图一般格式为:plt.scatter(x,y,...)
示例1
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1,2,3,4,5,6,7,8,9,10])
y = np.array([2,5,3,7,9,0,10,3,5,3])
plt.scatter(x,y)
plt.show()
示例2
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1,1,50)
y = x*x
plt.scatter(x,y,c="red",s=10,label="y=x*x")#这里的s是表示散点的大小,默认为20
plt.legend()
plt.show()
这里的s=10是表示散点的大小,默认为20
在散点图的点上写文字
利用plt.text()方法来写
例如:
plt.text(x[0],y[0],"A")
,这样表示在x[0]和y[0]位置上写如果想要改变x和y轴的位置
如:plt.text(x[0]+0.2,y[0],"A")
这样就是在x轴方向偏移0.2的距离
也可以写x和y轴位置plt.text(1,3,"A")
绘制柱状图
柱状图经常显示一些离散数据,是使用方法.bar(x,t,....)
进行构成的
在柱状图上x轴是一组字符串的列表
示例1
import matplotlib.pyplot as plt
c = ["2016", "2017", "2018", "2019"]
n = [5100, 3455, 3233, 6433]
x = range(len(c))
plt.bar(x, n, width=0.3, color=["b", "r", "y", "g"])
plt.xticks(x, c) # 通过xticks()将年份值标注到各个坐标值的位置上
plt.ylabel("Profit")
plt.xlabel("Year")
plt.show()
这里的width
是指柱的宽度,color是柱的颜色
在这里是使用plt.xticks(x,c)
将年份值标注到各个坐标值的位置上
如果不想怎么做也可以直接将c的坐标轴的值直接附上去
.ylabel()
和.xlabel()
是给x轴和y轴的标注名称
示例2
import matplotlib.pyplot as plt
c = ["2016", "2017", "2018", "2019"]
n = [5100, 3455, 3233, 6433]
plt.bar(c,n,width=0.3)
plt.text(c[0],n[0],"5100")
plt.text(c[1],n[1],"3455")
plt.text(c[2],n[2],"3233")
plt.text(c[3],n[3],"6433")
plt.show()
在这使用text()
方法是在柱子上表名柱子的值
如果想在给定y轴的值的距离区间可以使用.yticks(),如:plt.yticks(range(0,60,10))
,这样就是[0,10,20,30,40,50]
定义y轴的范围使用ylim()
例如:
plt.ylim(0,y.max()+4)
表示在y中最大值上添加4的长度
.scatter(x,y,…)`
示例1
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1,2,3,4,5,6,7,8,9,10])
y = np.array([2,5,3,7,9,0,10,3,5,3])
plt.scatter(x,y)
plt.show()
示例2
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1,1,50)
y = x*x
plt.scatter(x,y,c="red",s=10,label="y=x*x")#这里的s是表示散点的大小,默认为20
plt.legend()
plt.show()
这里的s=10是表示散点的大小,默认为20
在散点图的点上写文字
利用plt.text()方法来写
例如:
plt.text(x[0],y[0],"A")
,这样表示在x[0]和y[0]位置上写如果想要改变x和y轴的位置
如:plt.text(x[0]+0.2,y[0],"A")
这样就是在x轴方向偏移0.2的距离
也可以写x和y轴位置plt.text(1,3,"A")
绘制柱状图
柱状图经常显示一些离散数据,是使用方法.bar(x,t,....)
进行构成的
在柱状图上x轴是一组字符串的列表
示例1
import matplotlib.pyplot as plt
c = ["2016", "2017", "2018", "2019"]
n = [5100, 3455, 3233, 6433]
x = range(len(c))
plt.bar(x, n, width=0.3, color=["b", "r", "y", "g"])
plt.xticks(x, c) # 通过xticks()将年份值标注到各个坐标值的位置上
plt.ylabel("Profit")
plt.xlabel("Year")
plt.show()
这里的width
是指柱的宽度,color是柱的颜色
在这里是使用plt.xticks(x,c)
将年份值标注到各个坐标值的位置上
如果不想怎么做也可以直接将c的坐标轴的值直接附上去
.ylabel()
和.xlabel()
是给x轴和y轴的标注名称
示例2
import matplotlib.pyplot as plt
c = ["2016", "2017", "2018", "2019"]
n = [5100, 3455, 3233, 6433]
plt.bar(c,n,width=0.3)
plt.text(c[0],n[0],"5100")
plt.text(c[1],n[1],"3455")
plt.text(c[2],n[2],"3233")
plt.text(c[3],n[3],"6433")
plt.show()
在这使用text()
方法是在柱子上表名柱子的值
如果想在给定y轴的值的距离区间可以使用.yticks(),如:plt.yticks(range(0,60,10))
,这样就是[0,10,20,30,40,50]
定义y轴的范围使用ylim()
例如:
plt.ylim(0,y.max()+4)
表示在y中最大值上添加4的长度
标题用plt.title()
是给标题的方法