本节学习groupby
引用激励数据,连接数据库jili表(代码省略)
数字简单计算本节内容前面是运用sum/mean等函数对数字简单计算jili.mean() #求均值jili.mean(axis = 'columns') #求每行的均值jili.sum() #求和
groupby:切片计算
groupby的过程:
分割:把dataframe按指定的键分为若干组应用:对每个组应用函数,通常为累计、转换或过滤组合:将每组1的结果合并成一个输出数组。jili.groupby('dep') #聚合后没有用函数,会返回一个dataframejili.groupby('dep').sum() #用函数后会显示计算结果
# 组合dep 之后,切片oldrate,查看group的和。这里是字符,所以显示了group的所有值jili.groupby('dep')['group'].sum()#组合dep 之后,切片oldrate,查看oldrate的和jili.groupby('dep')['oldrate'].sum()
# 对每个可以计算的字段进行了描述性统计,中间有省略# unstack是上一节索引中的内容,是把多重索引转换为行,具体可以看下面没有用unstack的对比。jili.groupby('dep').describe().unstack()#对groupby之后的结果,切片allbones字段,进行描述性统计jili.groupby('dep')['allbones'].describe()
groupby:4 种计算方法
1、aggregate:在groupby之后聚合的值上计算
计算方法。如 sum,count,max,std
2、filter:在原来的每个值上做计算,但是在groupby之后做计算
切片 注意filter切片器中一定要有计算方法(summean之类的),否则会报错。
# aggregate可以设定计算方法jili.groupby('dep').aggregate(['min','max'])# filter对allbones列进行了切片,如果dep的allbones均值小于9000,则不显示. # 二部的均值低于9000,所以结果中没有二部数据。jili.groupby('dep').filter(lambda x:x['allbones'].mean() >9000)
3、transform:在原来的每个值上做计算,但是在groupby之后做计算
转换,把原来的值换为计算后的值
jili.groupby('dep').transform(lambda x:x -x.mean()).head(3) # x -x.mean()是减取本列的均值def fun(x): x['allbones'] = x['newbones']-x['oldbones'] return xjili.groupby('dep').apply(fun)
4、apply:
把计算的结果运用到原数据(看下图)
5、高级用法
#组合为两层jili.groupby(['dep','group']).mean()#组合为两层后,只选allbones的值,然后再转换行列jili.groupby(['dep','group'])['allbones'].sum().unstack()
以上就是groupby的用法,之前跟着视频学过,但看书的话更详细,下节是透视表,拜拜。