导图社区 Pandas
导图包含了matplotlib/pandas/numpy和一些常用的优化查询,有兴趣的可以看看哟。
编辑于2023-06-17 21:11:46 广东Numpy&pandas&matplotlib
numpy
数据类型
a=np.array([1,0,1,0,dtype=np.bool]
dtype=np.bool 指定数据类型
a.astype(np.int8)
修改数据类型
np.round(a,2)
修改浮点数小数点位数,a代表数组
数组的形状
a.shape([t])
查看a的维度,t=1时为列数,t=0时为行数
a.reshape(3,4)
a.reshape(2,2,3)
多少个参数表示多少个维度,第一个参数最外层数组
创建一个3行4列的多维数组,不会对数据本身有任何的修改
a.flatten()
把一个多维数组展开(多维变一维)
数组加减乘除
不同形状的数组计算
T5=np.arange(5)-T6=np.arange(4)
运算会报错
相同形状相同维度数组计算
T5=np.arange(5)-T6=np.arange(5)
对应位置进行相减
相同形状不同维度数组计算
T5=np.arange(10).reshape(2,5)-T6=np.arange(5)
对应位置元素都会进行一次计算
数组与单个值计算
T5=np.arange(10).reshape(2,5)*5
把单个值与数组的各个元素进行计算
轴(axis=)
axis=0
代表的是上下的行计算
axis=1
代表的是左右的列计算
创建矩阵
t=np.zero(2,3)
创建一个2行3列全为0的数组
t=np.one(2,3)
创建一个2行3列全为1的数组
t=eye(3)
创建一个3行3列对角为1的数组
[[1,0,0] [0,1,0] [0,0,1]]
本地文件导入
np.loadtxt(frame,dtype=np.int,dimiter=",",skiprows=0,usecols=None,unpack=Flase)
frame:文件地址,最好用变量传入
dtype:指定数据类型,默认np.float
dimiter:原文件使用什么符号进行数据分隔,例如","、"?",默认空格符,此参数必不可少
skiprows:跳过第几行读取数据
usecols:指定读取的列,索引,元组类型
unpack:使源文件的数据位置转至,即原数据行读取成列的形式输出,更为为True生效,默认Flase,这是读入时的转至
切片
t[0:5]
取第一行到第四行数组
t[0:5,1:5]
取第五行和第四列的数组,[行,列]
t[1]
取第一行数据
t[:,2]
取第二列数据
t[[1:5],[2:3]]
取1行2列和5行3列的个数
t[[1,5,8]]
取不连续的多行数据
单括号对应取行列,嵌套取个数
数据判断与替换
np.where(t<10,0,10)
与if(条件,true,Flase)作用相同
t.clip(a,b)
a小于,b大于,参数即判断亦替换,例t.clip(10,5),少于10替换10,大于5替换5
t[1:5]=10
替换为10,这种形式只能判断或替换
t[t>2]=10
t大于2的替换成10
数据拼接
竖拼接
np.vstack(t1,t2)
水平拼接
np.hstack(t1,t2)
作用相当于合拼,区分+-*/的使用作用
重复添加
np.repeat(a,b)
a代表是需要重复的值
b代表是需要重复的次数
随机数生成
np.random.rand(t0,tn)
0-1之间均匀分布的随机数(浮点数)
np.random.randn(t0,tn)
0-1之间标准正太分布随机数(浮点数)
np.random.randint(10,20,(4,5))
10-20之间生成随机整数,以4行5列形式输出
np.random.uniform(10,20,(4,5))
10-20之间生成均匀分布的数组(浮点数),以4行5列输出
np.random.normal(10,20,(4,5))
10-20之间生成正态分布的数组(浮点数),以4行5列输出
np.random.seed(s)
np.random.seed(10) t=np.random.randint(10,20,(4,5)) print(t)
S为随机种子,设定后第一次生成随机,后面不会变化
nan&inf处理
np.count_nonzero(t)
统计非零个数,True代表1,Flase代表0
np.isnan(t)=0
把nan数据替换为0
np.nan!=np.nan
统计非nan数据
inf代表的无限大,除0时会出现 在计算时有nan在内会报错
常用的统计函数
t.sum(axis=0)
列求和
np.median(t,axis=0)
中位数
t.mean(axis=0)
列求平均值
np.ptp(axis=0)
计算极差
np.std(axis=0)
计算标准差,表现数据的离散度,稳定程度
t.max()
t.min()
计算速度优化
矩阵存储方式选择
order='C',C-type在内存中以行方式排列
order='F',F-type在内存中以列方式排列
view比copy快
能不copy就不copy
ravel是flatten的view方式,快很多
一个个选是copy
:是view
::也是view
加法性能对比
a=a+1 最慢
np.add(a,1) 稍快
a+=1 更快
np.add(a,1,out=a) 最快
numpy比pandas运算快
pandas由numpy扩展而来
pandas
EXCEL文件处理pandas
调整输出界面显示数量
设置界面横方向显示的数量
设置最多显示的列数,None为显示所有
设置单列显示最大字符数量
列名与内容左右对齐
列名与内容上下对齐
如果列名使用了中文,需要设置pandas参数,默认的是False
df=pd.read_csv("文件路径")
tsv或者txt格式文件都使用read_csv进行读取
在参数中使用sep="符号"可以用于读取区分
同样拥有read_excel的参数功能
创建&写入Excel文件
df.to_excel(excel_writer , sheet_name='sheet1' , na_rep=' ' , float_format=None , coloumns=None , header=True , index=True , index_label=None , startrow=0 , startcol=0 , engine=None , merge_cells=True , encoding=None , inf_rep='inf' , verbose=True , freeze_panes=None)
index=False创建文件是不在第一列自动产生索引,默认:True
改善excel读入慢
使用to_pickle(文件.pkl)格式
没有文件则创建文件
读取文档
df=pd.read.excel(io,sheetname=0, header=0, skiprows=none, index_col=none, names=none, usecols=None, arse_cols=none, date_parser=none ,na_values=none, thousands=none, convert_float=true, has_index_names=none, converters=none, dtype=none,true_values=none, false_values=none, engine=none,squeeze=false,**kwds)
io :excel文件路径
skiprows=1 : 上而下略去数据行,1即略去一行
skiprows_footer:下而上略去
读取指定的列数据
usecols参数可以是纯数字或者字符串列表名,不支持切片形式读取,['a','b',..]&['列表名','列表名']
指定列索引列
index_col="列名"
指定读取的行位置
header : 默认0,取第一行做列名,None即不设定列名
类型转换
dtype:指定类型,dtype=({"ID":str})
只能转换成str类型,可以同时转变多个,ID是列名
指定列名
names : 指定列名,list形式[a,b,c,.....]
读取指定的表单
sheetname : 默认0,返回第一个表单,None返回全部表单,[0,1]返回多个表单
for i in range(0,5): df["件数"].at[i]=df["件数"].at[i]*2 这种方式适用于处理某段范围的数据,更接近于EXCEL中的单元格相加; 对于全列相加,python可以使用df['件数']+df['件数']方式
数据检查
数据表信息
print(df.info())
输出(维度,列表名称,数据格式,所占空间等)
查看唯一值
print(df['列名'].unique())
只能对特定一列进行检查
查看指定行数据
print(df.head())
默认查看前10行,可数字改变查看行数,df.tail()查看后10行
数据维度
print(df.shape) 输出(行,列)维度
数据清洗
df.dropna(how='any')
删除含有空值的行(df['列名'].dropna()指定列名
df.fillna(value=0)
空值填充成0(可以df['列名']指定
df[].map(str.strip)
删除字符串中的空格
跟excel的ctrl+G功能相似
df[].astype(int)
更换数据格式
df.rename(columns=[{'原名':'更改名'}]
更改列名
df.drop_duplicates(subset=["name","....."],keep="first",inplace=True)\
删除重复项,默认保留第一个出现的项,参数:keep='last'保留最后一个项
subset=[]参数是指定删除那一列的重复项,使用list可以同时指定多个
df.duplicates()返回重复项,以布尔的方式返回结果
df.index拿到重复项index,使用iloc[]拿到对应的行数
df.replace('原名','替换后名')
数据替换和更改
数据预处理
表格匹配pd.merge(df1,df2,how=′inner',on=['ID'],sort='True',indicator=False)
df1(条件-二维数组),df2是需要合拼的数据表对象
how=
df1/df2两个数据表共有的匹配到一个新的数据表中 inner(交集),left(返回的结果只包含左列),right(返回的结果只包含右列),outer(并集)四个不同功能参数
on=
on的参数是用于使用那一列名作为index,如果两边列名不一样,可以使用left_on或者right_on分别指定
sort=
默认True,建议改Flase,提升计算性能
indicator=
True在结果中新增一列,显示这一行数据的来源,来至作则显示left,来至右侧显示right
表格拼接pd.concat(objs,axis,join,ignore_index,keys,sort)
objs
要连接的表,可用[ ]添加多个表
axis
拼接方向,默认sxis=1纵向拼接,axis=0横向拼接
join
拼接方式,inner&outer
ignore_index
输出结果是否需要index(默认False
keys
给输出结果定义多出一行或一列,如keys=[A,B]
sort
排序
df.set_index('列名')
指定索引列
排序
df.sort_value(by=['列名'])
按指定列名进行排序
df.sort_index()
按索引值进行排序
np.where(df['列名']>10,TURE,FALSE)
与EXCEL中vloopup查找功能相似
df.loc(df['a'].isin(['value1','value2']))
isin([])判断列中是否有匹配到的值,如果有返回TRUE,没有返回FALSE df.loc()指明要进行判断的标签
pd.resample()
df.loc[df['列名']>10 & df['列名']==0,['列1,列2,....']].sort(['列名']),列名.sum() df.loc[df['列名']>10 & df['列名']==0,['列1,列2,....']].sort(['列名']),列名.count()
| :或 &:与 != :非
相似EXCEL的sumifs,countifs函数功能
df.query('列名==["value1","value2"]').列名.sum()
query可以指定条件配合其他函数进行筛选 相当于EXCEL的sumifs()函数
都是用于判断后计算
计算指定行列
csv需要指定encoding='gb2312"各式,否则无法读入
先读提取了行名和列名(list属性)
使用Loc提取对应行名values和列名values
行&列转换
df1=df.tramspose()
数据筛选
apply(func,axis=0,raw=False,args[**kwargs])
def a_l(a): return a>200 df=pd.read_excel(r"C:\Users\Administrator.BL-20180824CZAO\Desktop\20220404批次优化.xlsx",sheet_name="地堆优化",index_col="完整条码") df=df.loc[df["件数"].apply(a_l)].loc[df[].apply()].loc...... print(df)
这是Series的独有函数,可以同时添加多个条件
func:参数直接输入函数名
args:要作为关键字参数传递给func的其他关键字参数
计算统计引导
axis=1参数用于横向计算,默认是axis=0
计算区域的数据,提取DataFrame的子集[[子集]]
ignore_index=True用于数据向量拼接,默认是False
数据校验
assert断言函数
跟if not判断功能类似
使用If not则代替try: except:
输出的是不在这个范围内的数据
分组&透视表汇总
分组
df.groupby('列名')[a].count()
groupby参数是需要汇总的部分,可以用List的形式进行多个部分进行汇总
a列是需要进行计算的部分
df.groupby('列名')[a].agg([len,np.sum,np.mean])
agg参数可以同时多种处理方式
透视表
df.pivot_table(index=None,values=None,columns=None,aggfunc=mean,fill_value=None,margins=False,dropna=True)
index用于控制汇总行
columns用于控制汇总列
values用于计算的位置
aggfunc用于计算方式,默认平均值
都可以用做透视汇总,pivot_table功能更灵活
数据合并
pd.merge(df1,df2,on="列名")
"列名"即取那一列基准列
pd.concat([df1,df2],axis=0).reset_index(drop=True)
concat
合拼两个表格数据,axis控制合拼的行列
reset_index(drop=True)
删除原有的索引,重置索引
pd.concat(df,pd.columns=list(‘DF’))
一次追加多列
df.insert(2,column="E",value=)
在指定位置插入列(在第二列插入E)
df.drop(column=["A",“B”],inplace=True)
删除列
时间方式
from datetime import data,timedate
start = date(2022,9,15) df['列名'].at[i]=start+timedate(days=1)
timedate参数只有天数,小时,分钟,秒
满12个月自动跳转年
df['year']=pd.DatetimeIndex(文档['时间列']).year
包含字符串筛选
if 条件 in 范围 else做判断,定义一个条件和查找范围
if 范围 find(条件)
df1=df[df[columns ].str.contains('条件')]
产生一个新的df对象
df1=df[~df[columns ].str.contains('条件')]
产生一个新的df对象(相反条件)
Series一维
t=pd.Series([a,b,c ],index=[1,2,3])
a参数可以是列表、字典
列表a=np.arange(10) 字典a={"a":12,"b":20,.......}
index=可以指定索引的名称,长度len要与a一样,默认阿拉伯数字
t["索引1","索引2",........]
可以通过索引读取每一个values
t[0:10]
可以通过切片形式进行读取
for i in t.values:
通过迭代读取每一个值
for i in t.index:
通过迭代读取每一个索引
t.astype(np.float)
修改数据类型
import pandas as pd s1=pd.Series([100,50,200],index=[1,2,3],name="a") s2=pd.Series([111,45,212],index=[1,2,3],name="b") s3=pd.Series([150,86,165],index=[1,2,3],name="c") df=pd.DataFrame({s1.name:s1,s2.name:s2,s3.name:s3}) print(df)
DataFrame二维
index=列索引
columns=行索引
t=pd.DataFrame(np.arange(12),reshape(3,4),index=list('abc'),columns=list('zywx'))
情况查询
print(t.head(a))
显示头部几行,默认前5行
print(t.tail(a))
显示末尾几行,默认前5行
print(t.info())
行数,列数,列索引,列非空值个数,列类型,内存占用
print(t.describe())
计数,均值,标准差,最大值,四分位数,最小值
排序
t.sort_values(by=" ",ascending=True)
by参数是传入列名
by=[1,2]可以传入多个列名进行排序,分先后
ascending参数升降序,默认True升序,False为降序
ascending=[True,False],传入的可以是一个列表,与by位置参数相呼应
切片
跟numpy切片方式相同
loc
通过行标签索引读取数据
t.loc[ ]
取单个行&列
t.loc[0:3,["列名1","列名2"]]
取范围行&列
t.loc[[0,5,3],["列名1",“列名2”]]
取指定行&列
iloc
通过行位置索引读取数据
t.iloc[ : ,2]
使用loc/iloc会生成新的对象 loc[ [行],[列] ]
布尔索引
t[(t["列名"].str.len()>4)&(t["列名"]>100)]
str方法判断字符串的长度大于4
&且,l或
缺失数据处理
删除nan缺失值
t.dropna(axis=0,how="any",inplace=True)
axis=,选择行、列
how="any"删除有一个为False的行,相当于l
how="all",删除全是False的行,相当于&
inplace=True,修改原数据,默认为False
nan缺失值填充
df["列名"].at[位置]=填充值
列名:是要进行替换的列
位置:是要进行的行位置
在read.Excel时,不能指定index列
df['列名'].fillna(value,inplace=True)
列名:是要进行替换的列
value:替换后的值
inplace:必须要是True,输出才会看到修改
matplotlib(import matplotlib.pyplot as plt)
plt.bar(x,height,width,bottom,color,tick_label,orientation)
X:x轴显示的刻度 height:柱状图高度(Y轴) wdith:柱状宽(0~1之间,默认0.8 bottom:柱状图的默认起始位置 color:柱状颜色 tick_label:下标签 orientation:柱状图是垂直&水平(horizontal水平)
from matplotlib import pyplot as plt
设置图像大小
plt.figure(figsize=(20,8),dpi=80)
绘图
plt.plot(x=[ ],y=[ ],title="图标名",color="颜色")
a代表读入的文档变量名
设置文字格式
plt.title('图标名',fontsize=10,fontweight="bold")
设置XY标签属性
plt.xlabel('轴名',size=字号,fontweight='bold')
plt.ylabel('轴名',size=字号,fontweight='bold')
X轴标签显示不全解决
plt.tight_layout()
单独调整图表位置
a=plt.gac()
提取了x周标签
b=plt.gak()
调整x,y轴刻度
plt.xticks()
调整间距
传入一个参数(一个可迭代对象),步长可通过推导式或者切片得出
添加字符串到x,y轴
传入两个参数,分别是两个可迭代对象,数字和字符串最终会一一对应,只显示字符串
旋转刻度
plt.xticks(df['X轴刻度'],rotation=90)
展示
plt.show()
保存
plt.savefig(保存路径)
中文显示配置
matplotlib.rc
在window和linux中使用
font_manager
from matplotlib import font_manager
my_font=font_manager.FontProperties(fname="字体路径 ")
使用
要显示中文的地方添加fontproperties=my_manager
图例中使用prop=my_font添加
系统字体查询
fc-list
系统支持的字体
fc-list :lang=zh
系统现有的中文字体
图例
plt.plot(label="显示的名字")
plt.legend(loc) loc设置图例位置
在最后必须使用plt.legend(),图例才能正常显示
画图网格
plt.grid(alpha=0.4)参数透明度设置
plt.subplots同时创建多个子图
fig,axes=plt.subplots(2,2)创建2行2列子图
划分子图
ax1=axes[0,1]
ax1.plot()方式在各子图中绘制,其他子图使用方式相同
ax2=axes[1,1]
ax3=axes[1,1]
ax4=axes[0,0]
plt.bar()绘制柱状图
plt.bar(width=0.3)
plt.barh(height=0.3)
注意的是横和竖的使用参数不同,否则报错
其它使用方式与折线图相同
图标形状
折线图:plt.plot()
体现数据变化
散点图:plt.scatter()
体现X/Y轴之间的关系
饼图:plt.pie()
直方图:plt.hist()
统计延续的数据
柱状图:plt.bar()
统计离散数据
雷达图:plt.polar()
各图使用的方式类同,在参数上有差异
线性回归预测
导入科学计算库:form scipy.stats import linregress
slope,intercept,r,p,std_err=linregress(df.index,df.Revenue) [得出线性回归计算公式,不用理会原理,直接套用]
slope
intercept
相当于EXCEL中y=slope*x+intercept
numpy中数组的转至方式
a.T
a.transpose()
在read_ExceL读取文件参数中使用index_col="列名",可以指定转至后的columns值
a.swapaxes(1,0)
(1,0)意思是轴的代表,调换轴位置