1、matplotlib
设置中文
#todo 设置中文字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置全局字体为黑体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
matplotlib 转门用于开发 2D 、 3D 图表的 包
基本使用方法如下:
import matplotlib.pyplot as plt #1、创建画布 plt.figure(figsize=(20,8),dpi=100)# figsize画布的大小 dpi 图形清晰度 #2、绘制图像 plt.plot([1,2,3,4,5,6,7,8,9,10],[10,14,12,13,21,23,11,16,17,19]) #3、图像显示 plt.show()
plt.figure()常用参数
plt.figure()用于创建一个画布
参数名 | 含义 | 是否必需 | 默认值 | 示例 |
---|---|---|---|---|
num | 图形的编号或名称。可以是整数或字符串。若为整数,代表图形的编号;若为字符串,则作为图形窗口的标题。 | 否 | 自动分配一个编号 | plt.figure(num=2) 或 plt.figure(num='My Plot') |
figsize | 图形的大小,以英寸为单位,是一个包含两个元素的元组 (宽度, 高度) 。 | 否 | (6.4, 4.8) | plt.figure(figsize=(10, 6)) |
dpi | 图形的分辨率,即每英寸点数(dots per inch)。数值越大,图形越清晰。 | 否 | 100 | plt.figure(dpi=200) |
facecolor | 图形的背景颜色。可以是颜色名称(如 'red' )或颜色代码(如 '#FF0000' )。 | 否 | 'white' | plt.figure(facecolor='lightgray') |
edgecolor | 图形的边框颜色。同样可以是颜色名称或颜色代码。 | 否 | 'black' | plt.figure(edgecolor='blue') |
frameon | 是否绘制图形的边框。布尔值,True 表示绘制,False 表示不绘制。 | 否 | True | plt.figure(frameon=False) |
plt.plot()常用参数
plt.plot() 函数用于绘制折线图,以下是该函数的常用参数
参数名 | 含义 | 是否必需 | 示例 |
---|---|---|---|
x | 可选参数,代表 x 轴的数据,是一个一维数组或列表。若不提供 x 参数,matplotlib 会默认使用 [0, 1, 2, ...] 作为 x 轴的数据。 | 否 | plt.plot([1, 2, 3], [4, 5, 6]) 中 [1, 2, 3] 为 x |
y | 必需参数,代表 y 轴的数据,是一个一维数组或列表。 | 是 | plt.plot([1, 2, 3], [4, 5, 6]) 中 [4, 5, 6] 为 y |
fmt | 可选参数,是一个格式化字符串,用于快速设置线条的颜色、标记样式和线条样式。例如 'ro-' 表示红色(r )的圆形标记(o )和实线(- )。 | 否 | plt.plot([1, 2, 3], [4, 5, 6], 'go--') |
color | 可选参数,指定线条的颜色。可以是颜色名称(如 'red' )或颜色代码(如 '#FF0000' )。r 红色 、g绿色、b蓝色、w白色、c青色 | 否 | plt.plot([1, 2, 3], [4, 5, 6], color='green') |
linestyle | 可选参数,指定线条的样式,如 '-' (实线)、'--' (虚线)、'-.' (点划线)、:'(点虚线)、''(空格)。 | 否 | plt.plot([1, 2, 3], [4, 5, 6], linestyle='--') |
linewidth | 可选参数,指定线条的宽度,是一个浮点数。 | 否 | plt.plot([1, 2, 3], [4, 5, 6], linewidth=2.5) |
marker | 可选参数,指定数据点的标记样式,如 'o' (圆形)、's' (正方形)等。 | 否 | plt.plot([1, 2, 3], [4, 5, 6], marker='s') |
markersize | 可选参数,指定标记的大小,是一个浮点数。 | 否 | plt.plot([1, 2, 3], [4, 5, 6], markersize=10) |
添加图例
一个坐标系-多个图相
import matplotlib.pyplot as plt import random #todo 设置中文字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置全局字体为黑体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 #准备数据 x = range(60) # range是python的内置函数 创建一个不可变的整数序列 #range(start,stop,step) #print(x) 打印 range(0,60)意思是x是一个从0(包含)到60(不包含)的整数序列 y = [random.uniform(15,18) for i in x] y_beijing = [random.uniform(1,3) for i in y] #列表推导式->一种简洁的创建列表的方式 [expression for item in iterable] #random.uniform(a,b)用于生成一个在a(包含)到b(不包含)之间的随机浮点数 #1、创建画布 plt.figure(figsize=(10, 4), dpi=100, edgecolor='red', frameon=True) # figsize画布的大小 dpi 图形清晰度 #2、绘制图像 -- 一个坐标系 绘制多个图像 多次调用plt plt.plot(x,y,label='上海') plt.plot(x,y_beijing,color="r",linestyle='--',label='北京') #添加图例 plt.legend(loc='best') #准备x、y轴刻度 x_ticks_label = ["11点{}分".format(i) for i in x] y_ticks = range(40) #修改x、y轴刻度显示 # plt.xticks(x_ticks_label[::5]) 报错 坐标刻度 不能直接通过 字符串 修改 plt.xticks(x[::5], x_ticks_label[::5],rotation=45)#rotation 把标签旋转 plt.yticks(y_ticks[::5]) #添加网格显示 plt.grid(True,linestyle='--',alpha=0.5) #添加描述信息 plt.xlabel('时间') plt.ylabel('温度') plt.title('中午11点-12点某城市温度变化') #图像保存 ->放在 show 前面 show会释放figure资源 plt.savefig('test.png') #3、图像显示 plt.show()
多个坐标系显示
import matplotlib.pyplot as plt import random #todo 设置中文字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置全局字体为黑体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 # 0、准备数据 x = range(60) y_shanghai = [random.uniform(15,18) for i in x] y_beijing = [random.uniform(1,3) for i in x] # 1、创建画布 fig,axes = plt.subplots(nrows=1,ncols=2,figsize=(10,4),dpi=100) # 一行 两列 # 2、绘制图像 axes[0].plot(x,y_shanghai,label='上海') axes[1].plot(x,y_beijing,color="r",linestyle='--',label='北京') # 3、准备x、y轴刻度 , 构造x轴标签 x_ticks_label = ["11点{}分".format(i) for i in x] y_ticks = range(40) # 4、修改x、y轴刻度显示 axes[0].set_xticks(x[::5]) axes[0].set_yticks(y_ticks[::5]) axes[0].set_xticklabels(x_ticks_label[::5]) axes[1].set_xticks(x[::5]) axes[1].set_yticks(y_ticks[::5]) axes[1].set_xticklabels(x_ticks_label[::5]) # 5、添加网格显示 axes[0].grid(True,linestyle='--',color='r',alpha=0.5) axes[1].grid(True,linestyle='--',color='g',alpha=0.5) # 6、添加描述信息 axes[0].set_xlabel('时间') axes[0].set_ylabel('温度') axes[0].set_title("中午11点-12点,上海温度变化图",fontsize=20) axes[1].set_xlabel('时间') axes[1].set_ylabel('温度') axes[1].set_title("中午11点-12点,北京温度变化图",fontsize=20) # 7、图像保存 ->放在 show 前面 show会释放figure资源 plt.savefig('test2.png') # 8、添加图例 axes[0].legend(loc=0) axes[1].legend(loc=0) # 9、图像显示 plt.show()
折线图的应用场景
使用 numpy 的 sin函数
import matplotlib.pyplot as plt import numpy as np # 1、准备数据 x = np.linspace(-10, 10, 1000) # 从 -10 到 10 之间生成一千个数 y = np.sin(x) # 2、创建画布 plt.figure(figsize=(10, 4),dpi=100) # 3、绘制图像 plt.plot(x,y) # 4、添加网格 plt.grid(True) # 5、图像显示 plt.show()
常见图形绘制
-
折线图:plt.plot(x,y)
-
散点图:plt.scatter(x,y)
-
柱状图:plt.bar(x,witdh,align='center',**kwargs)
x:需要传递的数据
width:柱状图的宽度
align:每个柱状图的位置对齐方式 {'center','edge}
**kwargs:color:柱状图的颜色
-
直方图:plt.hist(x,bins:None)
处理连续的数据
y轴:表示每个箱内数据点的数量
x:数据
bins:组距
-
如果 bins 为整数,表示 有 bins 个柱子
-
如果 bins 为序列,表示每个箱的边界
[0,1,2,3,4]->[0,1),[1,2),[2,3),[3,4)
-
-
饼图:plt.pie(x,labels,autopct,colors)
x:数量,自动计算百分比
labels:每部分标签(名称)
autopct:占比显示指定 %1.2f%%
colors:每部分颜色
1、散点图绘制
import matplotlib.pyplot as plt # 1、准备数据 X=[225.98,247.07,253.14,457.85,241.58,301.01,20.67,288.64, 163.56,120.06,207.83,342.75,147.9,553.06,224.72,29.51, 21.61,483.21,245.25,399.25,343.35] y=[196.63,203.88,210.75,372.74,202.41,247.61,24.9,239.34, 140.32,104.15,176.84,288.23,128.79, 49.64,191.74,33.1, 30.74,400.02,205.35,330.64,283.451] # 2、创建画布 plt.figure(figsize=(10, 4),dpi=100) # 3、绘制图像 plt.scatter(X,y) # 4、添加网格 plt.grid(True) # 5、图像显示 plt.show()
2、柱状图绘制
import matplotlib.pyplot as plt #todo 设置中文字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置全局字体为黑体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 #0.准备数据 #电影名字 movie_name=['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','七十七天','密战','狂兽','其他'] #横坐标 x=range(len(movie_name)) #票房数据 y=[73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222] #1.创建画布 plt.figure(figsize=(20,8),dpi=100) #2.绘制柱状图 plt.bar(x,y,width=0.5,color=['b','r','g','b']) #2.1b修改x轴的刻度显示 plt.xticks(x,movie_name) #2.2添加网格显示 plt.grid(linestyle="--",alpha=0.5) #2.3添加标题 plt.title("电影票房收入对比") #3.显示图像 plt.show()
1.2 Seaborn
安装
pip install seaborn
导入
import seaborn as sns
2、numpy
Numpy是一个科学计算库,用于快速处理任意维度的数组
支持 常见数组 和 矩阵 的操作
Numpy 使用 ndarray 对象来处理多维数组
ndarray介绍
np.array(object,dtype)
处理二维数组
import numpy as np # 创建ndarray score = np.array( [[80, 89, 86, 67, 79], [78, 97, 89, 67, 81], [90, 94, 78, 67, 74], [91, 91, 90, 67, 69], [76, 87, 75, 67, 86], [70, 79, 84, 67, 84], [94, 92, 93, 67, 64], [86, 85, 83, 67, 80]]) print(score)
ndarray 比 python 原生 list 与运算效率 更高
import random import time import numpy as np # 生成包含 100000000 个随机数的列表 a = [] for i in range(100000000): a.append(random.random()) # 使用 time 模块测量 sum 函数的执行时间 start_time_1 = time.time() sum1 = sum(a) end_time_1 = time.time() print(f"使用内置 sum 函数计算的和: {sum1}") print(f"内置 sum 函数执行时间: {end_time_1 - start_time_1} 秒") # 将列表转换为 numpy 数组 b = np.array(a) # 使用 time 模块测量 np.sum 函数的执行时间 start_time_2 = time.time() sum2 = np.sum(b) end_time_2 = time.time() print(f"使用 numpy 的 sum 函数计算的和: {sum2}") print(f"numpy 的 sum 函数执行时间: {end_time_2 - start_time_2} 秒")
使用内置 sum 函数计算的和: 50000649.008911066 内置 sum 函数执行时间: 0.48445725440979004 秒 使用 numpy 的 sum 函数计算的和: 50000649.00891127 numpy 的 sum 函数执行时间: 0.1631016731262207 秒
ndarray在存储数据的时候,数据和数据的地址都是连续的
list在存储数据的时候,数据和数据的地址是不连续的
使得批量操作数组元素时,ndarray的速度更快
ndarray支持并行运算
numpy底层用C语言写,效率远高于纯python代码
属性
import numpy as np # 创建ndarray score = np.array( [[80, 89, 86, 67, 79], [78, 97, 89, 67, 81], [90, 94, 78, 67, 74], [91, 91, 90, 67, 69], [76, 87, 75, 67, 86], [70, 79, 84, 67, 84], [94, 92, 93, 67, 64], [86, 85, 83, 67, 80]]) print(score.shape)#(8,5) 返回表示数组维度的元组 print(score.ndim)#2 数组维度 print(score.size)#40 元素数量 print(score.itemsize)# 一个数组元素的长度(字节) print(score.dtype)#数组元素的类型
dtype
import numpy as np # 创建数组时指定类型 数组 , dtype = 类型 score = np.array([[1,2,3],[1,2,3]],dtype=np.float64) print(score)
一、数组
1、生成0、1数组
# np.ones(shape,dtype) # np.zeros(shape,dtype) # np.ones_like(arr,dtype) # np.zeors_like(arr,dtype) score = np.ones([5,5]) ''' [[1. 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、从现有数组生成
arr = np.array([1,2,3],[3,2,1]) # np.array(arr) 深拷贝 新的数组 # np.asarray(arr) 浅拷贝
3、生成固定范围的数组
1、np.linspace(start,stop,num,endpoint)
创建 等差数组 - 指定数量
start : 序列起始值 ,stop : 序列终止值,num:要生成的等间隔的样例数量,默认50,endpoint:序列中是否包含 stop 值,默认true
import numpy as np score = np.linspace(0, 100, 11,dtype=np.int64) print(score) # [ 0 10 20 30 40 50 60 70 80 90 100]
2、np . arange ( [start=0] , stop , [step=1] , dtype )
创建 等差数组 - 指定步长
import numpy as np score = np.arange(0, 30, 2,dtype=np.int64) print(score) # [ 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28]
3、np . logspace( start , stop , num )
生成 从 10^start 到 10^stop 的 num 个数
用于生成在对数刻度
上 均匀分布
的数字序列。这个函数特别有用,当你需要在对数尺度
上创建一组数时,比如用于绘制对数坐标图
。
import numpy as np score = np.logspace(0, 5, 3,dtype=np.int64) print(score)
4、np .random 随机数组
1、正态分布
方差越小 越瘦高
方差越大 越矮胖
正态分布创建方式
np.random.normal(均值,标准差,size)
size:
-
数组 生成一个一维数组,包含指定数量的随机数
-
元组 生成一个多维数组,形状由元组决定
import numpy as np import matplotlib.pyplot as plt x = np.random.normal(0,1,100000000) plt.figure(figsize=(10,4),dpi=100) plt.hist(x,1000) plt.show()
2、均匀分布
import numpy as np import matplotlib.pyplot as plt x1 = np.random.uniform(-1,1,100000000)#从 -1 到 1 一亿个数据 plt.figure(figsize=(20,8),dpi=100) plt.hist(x1,bins=1000)# 划分为 1000 组 plt.show()
4、数组的基本操作
1、形状修改
ndarray.reshape(shape,order) -- 不会修改原数组,返回新数组
-
ndarray.reshape([-1,2]) :未知行 2 列 【-1表示待计算】
-
ndarray.reshape([3,-1]) :3 行 未知列 ,如果 不能被 3 整除,则报错
ndarray.resize(new_shape) -- 修改原数组,没有返回值
ndarray.reshape.T 转置 ,例:把原本的[3,2]变成[2,3]
2、类型修改
ndarray.astype(np.int64)
ndarray.tostring()
3、数组的去重
ndarray.unique() 返回一个新数组
import numpy as np a = np.array([[1,2,3,4],[2,3,4,5]]) print(a) #[[1 2 3 4] # [2 3 4 5]] a = np.unique(a) print(a) #[1 2 3 4 5]
4、数组的运算
1、逻辑运算
1、逻辑判断
ndarray 判断
返回
新的ndarray
import numpy as np a = np.random.randint(40,100,(10,5)) print(a) a = a[6:] print('--获取后四行--') #[[42 41 92 81 97] # [81 73 75 84 58] # [65 43 64 88 93] # [57 60 81 62 92]] a = a>60 # 返回值赋值 print(a) #[[ True True True False True] # [ True True False False False] # [False True True True False] # [ True True True False False]]
2、bool赋值
将满足条件的元素设置为指定的值
直接修改
原数组
import numpy as np a = np.random.randint(40,100,(10,5)) print(a) a = a[6:] print('--获取后四行--') # 直接对数组修改 满足条件的赋值为1 a[a>60] = 1 print(a)
2、通用判断函数
-
np.all( 逻辑判断 )
-
返回:bool值
import numpy as np a = np.random.randint(40,100,(10,5)) # 直接对数组修改 满足条件的赋值为1 b = np.all(a[0:2,:]>60) print(b)
-
np.any( 逻辑判断 )
-
返回:bool值
b = np.any(a[0:2,:]>90)
3、三元运算符
单一逻辑判断
-
np.where( 逻辑判断 ,满足的赋值 ,不满足的赋值 )
-
通过 np.where 能够进行更加复杂的运算
temp = np.where(a[:4,:]>60,1,0) # 满足赋值为1 # 不满足赋值为0
复合逻辑判断
-
需要使用
np.logical_and
和np.logical_or
temp = np.where( np.logical_and ( a>60,a<90 ),1,0 )
4、统计运算
4.1统计指标
前面都要加np
统计值
-
np.max(a,axis)
-
np.min(a,axis)
-
np.median(a,axis) 计算数组元素的
中位数
-
np.mean(a,axis) 计算数组元素的
平均值
-
np.std(a,axis) 计算数组元素的
标准差
-
np.var(a,axis) 计算数组元素的
方差
import numpy as np a = np.random.randint(40,100,(10,5)) a = a[:4,:4] print("前四名学生中,各科成绩的最高分分别是{}".format(np.max(a,axis=0))) # a 是数据, # axis 是轴 # 有可能axis=0代表列 axios=1代表行 # 有可能axis=0代表行 axios=1代表列 # 要自己先试一下 # 如果传了 axis 返回的是一个数组 # 如果不传 axis 则返回的是二维数组中最max的一个值
统计值对应的下标
-
np.argmax(a,axis)
-
np.argmin(a,axis)
print("前四名学生中,各科成绩的最高分的同学的下标是{}".format(np.argmax(a,axis=0))) #前四名学生中,各科成绩的最高分的同学的下标是[1 2 0 0]
5、数组间运算
1、数组与数的运算
对于 ndarray 数组
import numpy as np a = np.array([1,2,3,4,5,6,7,8,9,10]) # 数组与数的运算 a = a+1 print("a+1后,a={}".format(a)) a = a/2 print("a/2后,a={}".format(a)) # a+1后,a=[ 2 3 4 5 6 7 8 9 10 11] # a/2后,a=[1. 1.5 2. 2.5 3. 3.5 4. 4.5 5. 5.5]
对于 原生python 列表
不能实现 b = b+1,会报错
只能使用 列表推导式
b = [1,2,3,4,5,6,7,8,9,10] b = [i+1 for i in b] print("b+1后,b={}".format(b))
如果 b = b * 3,会把列表的元素复制 3 次
b = [1,2,3] b = b*3 print("b*1后,b={}".format(b)) #b+1后,b=[1, 2, 3, 1, 2, 3, 1, 2, 3]
2、数组与数组的运算
2.1广播机制
(4,1) 延伸为 (4,3)
(3,) 延伸为 (4,3)
再相加
广播(Broadcasting)是一种强大的机制,它允许在不同形状的数组
之间进行算术运算。广播机制的核心思想是让较小
的数组在某些维度
上进行扩展
,使其形状与较大的数组兼容
,从而可以进行元素级别的操作
触发广播机制的条件
多个数组进行运算,如果shape不相同
满足一个即可 触发广播机制
-
数组的某一维度大小等长
-
其中一个数组的某一个维度大小为1
步骤:
1、补齐维度数量
两个数组进行广播时,从右向左比较它们的维度大小。如果两个数组的维度数量不同,会在维度数量较少的数组的左侧补 1,直到两个数组的维度数量相同。
2、比较维度大小
每一个维度都要满足 上述两个条件之一,才能触发广播机制
例如,有一个形状为 (3, 1)
的数组 A
和一个形状为 (3,)
的数组 B
:
-
数组
A
的维度为 2,形状是(3, 1)
。 3x1 -
数组
B
的维度为 1,形状是(3,)
。 1x3 为了使它们的维度数量相同,会在数组B
的左侧补 1,将其形状变为(1, 3)
。
从右到左比较维度大小
3 x 1
1 x 3
右侧维度大小 有一个为1——》满足
左侧维度大小 有一个为1——》满足
再举一个栗子
3x2
1x3
右侧维度大小 不满足相等 也不满足 为1 ——》无法广播
不用再看左边
如果两个数组无法
进行广播操作,会抛出 ValueError
异常。
广播机制要求所有对应维度
都满足特定条件,只要有一个维度不满足,就不能进行广播。
二、矩阵和向量
1、矩阵
矩阵 matrix ,必须是 二维的
2、向量
一种特殊的矩阵,一般是列向量,(3,1) 列向量
3、矩阵的运算
-
np.matmul(矩阵a,矩阵b) 只能矩阵乘矩阵
-
np.dot(矩阵a,矩阵b || 数字 ) 能矩阵 乘 矩阵,也能矩阵 乘 数字
3、pandas
1、介绍
作用:
-
增强图标可读性
-
便捷的数据处理能力
-
读取文件方便
-
封装了 matplotlib、numpy 的画图和计算
2、Pandas数据结构
-
Series结构 —— 一维数据结构
-
Dataframe结构 —— 二维的表格型数据结构
-
Multilndex和panel结构 —— 三维的数据结构
1、Series
由 数据 和 索引 组成
1.1、Series的创建
import pandas as pd pd.Series(data=None,index=None,dtype=None)
-
data:传入的数据,可以是ndarray、list、字典
-
index:索引,必须是唯一的,并且与数据的长度相等,如果不传入索引,会自动创建从0~N的整数索引
指定索引
pd.Series([1,2,3,4,5],index=[1,2,3,4,5])
通过字典创建
series = pd.Series({'red':100,'blue':200,'green':300}) #创建后 red、blue、green就是索引值 print(series) #red 100 #blue 200 #green 300 #dtype: int64 print(series['red']) # 打印 100
1.2、Seires的属性
-
index:获取 Series 对象的下标
-
values:获取 Series 对象的 值
import pandas as pd series = pd.Series({'red':100,'blue':200,'green':300}) index = series.index print(index) # Index(['red', 'blue', 'green'], dtype='object') values = series.values print(values) # [0 1 2 3 4 5 6 7 8 9]
2、Dataframe
二维数组对象
行索引:axis = 0
列索引:axis = 1
2.1、Dataframe的创建
import pandas as pd df = pd.DataFrame(data=None,index=None,columns=None)
-
index:行标签,若不传入,创建0~N的索引
-
columns:列索引,若不传入,创建0~N的索引
例如
import pandas as pd import numpy as np df = pd.DataFrame(data=np.array([[100,87],[99,96]]),index=['小明','小红'],columns=['语文','数学']) print(df) # 语文 数学 #小明 100 87 #小红 99 96
2.2、Dtaframe的属性
-
shape : 维度形状,
如果是(5,3),则df.shape[0]是5,[1]是3
-
index:行索引列表
-
columns:列索引列表
-
values:得到array的值
-
head(行数=5):显示前几行,默认为5
-
tail(行数=5):显示后几行,默认为5
2.3、修改行索引
2.3、MultiIndex 多重索引
-
df.index.names
-
df.index.lavels
-
df.index.codes
创建多重索引
import pandas as pd arrays = [[1, 2, 3, 4], ['blue', 'red', 'blue', 'red']] mp = pd.MultiIndex.from_arrays(arrays, names=['number', 'color']) # 创建一个具有多重索引的 DataFrame data = {'value': [10, 20, 30, 40]} df = pd.DataFrame(data, index=mp) print(df)
或者 直接df设置多个行索引
2.4、从DF中获取Series
-
df['列名'],保留了行索引的信息
-
df.values 返回一个ndarray,失去了行索引的信息,每一个元素代表一行的信息
3、基本数据操作
1、数据读取
-
pd.read_csv():读取csv文件,转化成df格式
-
删除列:pd.drop(["列名"],axis=1【表示删除列】)
2、数据选择
1、基于索引数字选择
-
pd.iloc[]
参数
-
整数。例如:
5
pd.iloc[5]#选择第6行
-
整数构成的列表或数组。
pd.iloc[[1,2,3]]#选择第2、3、4列
-
布尔数组。
-
可返回索引值的函数或参数。
-
切片
pd.iloc[:5]#选择前五行 pd.iloc[:,1:4]#选择第2-4列
-
2、基于标签名选择
-
pd.loc[ ]
参数
-
单个标签。例如:
2
或'a'
,这里的2
指的是标签而不是索引位置。 -
列表或数组包含的标签。例如:
['A', 'B', 'C']
。df.loc[:, 'Total Population':'Total Males']
-
切片对象。例如:
'A':'E'
,注意这里和上面切片的不同之处,首尾都包含在内。 -
布尔数组。
-
可返回标签的函数或参数。
-
3、直接使用行列索引
data['列名']['行名']
3、赋值
-
df.close = 1 ——>把列名为 close 的值都设置为1
-
或者 df[ 'close' ] = 1'
-
或者 df.loc[:,'close'] = 1
4、排序
1、Dataframe排序
-
df.sort_values()
-
df.sort_index()
多个键排序:先根据第一个排序,如果第一个相等,则再比较第二个,以类推
2、Series排序
5、算数运算
1、加减
-
df['列名'].add(值)
-
df['列名'].sub(值)
2、逻辑运算
-
逻辑赋值:data['列名'] > 20
只要大于20都赋值为True
-
选择满足条件的一行,多个条件
data[ (data['列名']>20 & data['列名']<24 ) ]
-
query(字符串)
data.query("open>20 & open<24"),这里的列名不用加""
-
isin(数组),看元素的值是否属于这个数组
data[ data['open'] . isin([23.23,23.78]) ]
3、统计运算
describe
-
df.describe()
统计函数
-
例如:sum(1)【1表示以行为轴,0表示以列为轴】
-
默认为0,
-
median()先把数据从小到大排列,再取中位数
-
idmax():返回指定轴上最大值所在元素的索引标签
-
idmin():返回指定轴上最小值所在元素的索引标签
累计统计函数
自定义运算
4、pandas画图
df对象.plot(kind='line')
5、文件读取与存储
CSV文件
HDF5文件
-
pd.to_hdf("路径.h5",key="字符串")
-
pd.read_hdf("路径".h5,key="字符串")
JSON
6、缺失值的处理
-
np.nan ——>NaN
-
pd.isnull(df)
-
pd.notnull(df)
-
pd.fillna(替换值,inplace = bool)
-
pd.dropna()
读取文件时,报错,取消证书验证
缺失值不为Nan
7、数据离散化
1、离散化
2、将分类变量变成哑变量
-
get_dummies
8、合并
1、数据的合并
-
pd.concat()
-
pd.merge()
9、交叉表与透视表
-
crosstab
-
pivot_table
10、分组聚合
-
groupby(by=分组的键,as_index=bool【分组的键是否作为索引】)
-
根据指定的键分组
-
对每个组进行求和、计数、求平均值等等
-
每个组的结果组合成一个新的对象
有一个dataframe 名为 df
df.groupby(['color'])['price1'].mean() # 按 color 分组,计算 price1 列的平均值 # df.groupby(['color'])返回的是一个DataFrameGroupBy对象 # 对象['price1']获取对象的这一列
和
df['price1'].groupby(df['color']).mean()
都可以得到
如果不想要 color
作为行索引
df.groupby(['color'],as_index=False)['price1'].mean() # 不作为行索引