anaconda平台都有
numpy
导入
import numpy as np
查看版本
np._version_
numpy数组构造
np.array([1,2,3])
构造一维数组
[1,2,3]np.array([1,2,3],[4,5,6])
构造二维数组
[1,2,3],
[4,5,6]np.ones(shape=(3.2))
以1填充的3行2列二维数组
[1,1],
[1,1],
[1,1]np.zeros(shape=(3.2,3))
以0填充三维数组,由3个3X2的二维数组构成
[[0,0],
[0,0],
[0,0]],
[[0,0],
[0,0],
[0,0]],
[[0,0],
[0,0],
[0,0]]np.full(shape=(4,3),fill_value=5)
四行三列一个,5填充的三维数组
[[5,5,5],
[5,5,5],
[5,5,5],
[5,5,5]]np.random.randint(0,10,size=(2,3))
构建0-10随机数的2×3的二维数组np.random.random(size=(3,4))
构建0-1随机浮点数的3×4的二维数组np.random,permutation(10)
构建0-9的随机索引(随机排列,不重复)np.linspace(0,10,11)
构建等差数列,0-10之间,11个数字
[0,1,2,3,4,5,6,7,8,9,10]np.arange(0,10,1)
用步长构建等差,0-10,步长为1,不包含10
[0,1,2,3,4,5,6,7,8,9]
一维数组访问
array = [7,8,10,11,8,6,20,9]
numpy数组与列表访问方法一致,都利用[索引]
array[0] 结果是7 array[4] 结果是8 array[-1] 结果是9
array[:2] 结果是[7,8]
numpy数组也有特殊的,比如可以使用列表作为索引项
array[[1,2,1,2]] 结果是[8,10,8,10]
也可以使用布尔列表访问
array[[true,false,true]] 结果是[7,10]
array[array > 9] 结果是[10,11,20]
高维数组访问
[[9,8,7],
[7,8,6]]
常规列表访问
array[0] 结果是[9,8,7] array[0][0] 结果是9 array[1,2] 结果是6
数组运算
array1
[1,2,3],
[4,5,6],
[2,3,4]
array2 = np.array([1,2,3])
array3 = np.array([1],[2],[3])
数组加常数,array1+10
[11,12,13],
[14,15,16],
[12,13,14]
两个符合广播机制(重复现有数组结构,补充维度,扩展成可运算的数组)的数组相加
array2会扩展成
[1,2,3],
[1,2,3],
[1,2,3]
array3会扩展成
[1,1,1],
[2,2,2],
[3,3,3]
array2 + array3
[2,3,4],
[3,4,5],
[4,5,6]
([1,2,3]) + ([1,2],[3,4]) 无法扩展会报错
numpy的排序方法
data = np.random.permutation(10)
生成不重复的0-9十个数字,假定为[8,7,5,4,9,6,3,2,1,0]np.sort(data)
numpy的sort方法不会更改data值,data此时还为[8,7,5,4,9,6,3,2,1,0]
但是np.sort(data)的返回值为[0,1,2,3,4,5,6,7,8,9]data.sort()
将data从小到大排列,data.sort是没有返回值的,直接更改data的值为[0,1,2,3,4,5,6,7,8,9]
numpy的拷贝方法
c_data = data.copy()
c_data[0] = 9
c_data会被更改掉一个数字,而data保持不变
numpy的级联方法
array1 = np,random.randint(0,10,size = (3,2))
array2 = np,random.randint(0,10,size = (3,3))
np.concatenate((array1,array2),axis=1)
数组1为3行2列,数组2为3行3列,np.concatenate默认是纵向连接,也就是加行。但数组1和2的列不同,不能纵向连结,axis=1,将连接方式改为横向,也就是扩列。
pandas
导入
import pandas as pd
from pandas import Series,DataFrame
Series 一维列表 包含可显示的索引 可以通过index进行调整pd.read.excel('xxxx.xlsx')
pd.read.csv('xxxx.csv')
数据读取
基本的pandas数组,Series和DataFrame
Series([1,2,3])
0 1
1 2
2 3s = Series([1,2,3],index = ['Sun','Moon','Star'])
Sun 1
Moon 2
Star 3
s['Sun']
s.loc['Sun']
显式访问,第二种是padas专有,结果为1s[0]
隐式访问结果为1s.loc[s >1]
Moon 2
Star 3
DataFrame 二维表格 引入行标签列标签,行标签是index,列标签是columnsDataFrame(data=np.random.randint(0,10,size=(3,5)),index=['Sun','Moon','Star'],columns=['v','w','x','y','z'])
v w x y z
Sun 1 8 0 6 7
Moon 2 5 5 6 1
Star 3 3 6 7 2
df.loc['Sun','y']
显式访问为6df.loc[['Sun','Star'],'y']
Sun 6
Star 7
Name:ydf.loc['Sun',['x','y']]
x 0
y 6
Name:Sun
参数中的某一维可以传列表,也可以传布尔
pandas数组的计算
pandas的数组运算通常采用索引对齐,pandas和numpy的运算通常采用广播
DataFrame + DataFrame,相同索引相加,没有顺序问题
DataFrame + Series,对所有相同索引相加,默认基于列表签运算
v w x y z
Sun 3 8 6 6 6
Moon 2 6 9 6 6
Star 3 4 8 8 0
与df.loc['Sun',['v','x','y','w']]
v 3
x 6
y 6
w 8
Name: Sun, dtype: int64
由于这个一维数组没包含所有列标签,首先会用Na补齐z列,再相加
v w x y z
Sun 6.0 16.0 12.0 12.0 NaN
Moon 5.0 14.0 15.0 12.0 NaN
Star 6.0 12.0 14.0 14.0 NaN
如果与df.loc[['Sun','Moon'],'w']
Sun 8
Moon 6
Name: w, dtype: int64
直接相加的话,列标签没有Sun和Moon,Series数组会用Na补足其vwxyz列,DataFrame二维数组会用Na补足齐Sun和Moon列,结果是3×7的Na数组
Moon Sun v w x y z
Sun NaN NaN NaN NaN NaN NaN NaN
Moon NaN NaN NaN NaN NaN NaN NaN
Star NaN NaN NaN NaN NaN NaN NaN
df.add(df.loc[['Sun','Moon'],'w'],axis = 'index')
利用add命令和axis的’index’参数,可以进行行标签加法
v w x y z
Moon 8.0 12.0 15.0 12.0 12.0
Star NaN NaN NaN NaN NaN
Sun 11.0 16.0 14.0 14.0 14.0
pandas数组的聚合运算
score = df.loc['Sun',['v','x','y','w']]
score.sum(),score.mean(),score.min(),score.var(),score.max(),score.std()
(23, 5.75, 3, 4.25, 8, 2.0615528128088303)
求和,平均值,最小值,方差,最大值,标准差,mean函数针对布尔数据可以看出true的占比df.sum()
v 8
w 18
x 23
y 20
z 12
dtype: int64
DataFrame默认是列标签求和df.sum(axis=1)
Sun 29
Moon 29
Star 23
dtype: int64(score>5).any()
True
score里存在大于5的数(score>5).all()
False
score中并非所有都大于5(df>5).all()
v False
w False
x True
y True
z False
dtype: bool
DataFrame基于列表签运算,如需变为行(df>5).all(axis=1)
series对象包含一个map函数,可以对所有的内容批量处理执行map后面的程序def add_yuan(x):
return(str(x)+'元')score.map(add_yuan)
v 3元
x 6元
y 6元
w 8元
matplotlib
导入
import matplotlib.pyplot as plt
%matplotlib inline
设置画板
plt.subplot(111)
111代表1行1列第1个位置 221表示2行2列第一个plt.subplot(222)
plt.subplot(223)
美化画板
plt.xlabel('个数')
设置横轴名称plt.ylabel('个数',fontsize=20)
设置纵轴名称及字体大小
可以使用下划线接收绘图函数,来屏蔽绘图函数的返回值,比如 _ = plt.bar([‘a’,’b’,’c’,’d’,’e’],y) 或者在绘图函数下方增加无返回值的函数plt.show()plt.xticks(rotation=60),plt.yticks(rotation=60)
对x轴和y轴上的数字plt.bar(['a','b','c','d','e'],y,color = np.random.random(size=(5,3)))
plt.plot(x,y,color=(0,0.5,0))
所有绘图函数,都可以添加color参数,color是0-1的三个小数组成import warnings
warnings.filterwarnings('ignore')
忽略报警信息sns.set()
seaborn的默认美化设置plt.rcParams['font.sans-serif'] = 'SimHei'
设置字体,支持中文,需要在/root/anaconda3/lib/python3.9/site-packages/matplotlib/mpl-data/fonts/ttf及/usr/share/fonts中有对应的SimHei,tff的字体,同时删除/root/.cache/matplotlib的缓存
折线图
plt.subplot(221)
x = np.linspace(0,3*np.pi,100)
plt.plot(x)
plt.subplot(224)
y = np.sin(x)
plt.plot(x,y)
注意:单独的x绘图,其实是y=[1,2,3,4,5…] 这种绘图方式
另外,两个数据都可以使用文本列表,文本列表的数值就是按顺序[1,2,3,4,5…]排列,通常可以使x轴以文本列表的形式出现,比如[‘jan’,’feb’,’march’,’april’,’june’]
直方图
x = np.random.randint(0,10,5)
y = np.cos(x*x*10)
plt.bar(x=['a','b','c','d','e'],height=y)
由于直方图是非连续的有限数组,参数1表示横轴,参数2表示高度,也可以省掉赋值运算,直接传两个参数plt.bar(['a','b','c','d','e'],y)
饼图
plt.figure(figsize=(5,5))
调整画布比例plt.pie(x,labels = ['a','b','c','d','e'],autopct = '%.2f%%')
绘制饼图,x参数是绘制用的数组,第二个参数是标签,autopct是百分比,%.2f是显示方式,%%两个百分号转义一个百分号
plt.show()
屏蔽返回值
seaborn
导入
import seaborn as sns
df = DataFrame(data=np.random.randint(0,10,size=(3,5)),index=['Sun','Moon','Star'],columns=['v','w','x','y','z'])
v w x y z
Sun 4 6 5 2 1
Moon 9 2 5 3 4
Star 5 9 3 9 1
sns.countplot(df['x'])
针对x列的计数统计直方图
re
导入
import re
正则表达式导入def remove_space(x):
return re.sub(r'\s+','',x)
将x里所有符合\s+正则规则的内容都替换掉并且返回
原创文章,作者:熊阿初,如若转载,请注明出处:https://www.guofc.com/1027.html