本节学习groupby

引用激励数据,连接数据库jili表(代码省略)
数字简单计算
本节内容前面是运用sum/mean等函数对数字简单计算

jili.mean() #求均值
jili.mean(axis = 'columns') #求每行的均值
jili.sum()  #求和

groupby:切片计算

groupby的过程:
分割:把dataframe按指定的键分为若干组
应用:对每个组应用函数,通常为累计、转换或过滤
组合:将每组1的结果合并成一个输出数组。

jili.groupby('dep')  #聚合后没有用函数,会返回一个dataframe
jili.groupby('dep').sum()   #用函数后会显示计算结果

clipboard.png

# 组合dep 之后,切片oldrate,查看group的和。这里是字符,所以显示了group的所有值
jili.groupby('dep')['group'].sum()

#组合dep 之后,切片oldrate,查看oldrate的和
jili.groupby('dep')['oldrate'].sum()

clipboard.png

# 对每个可以计算的字段进行了描述性统计,中间有省略
# unstack是上一节索引中的内容,是把多重索引转换为行,具体可以看下面没有用unstack的对比。
jili.groupby('dep').describe().unstack()

#对groupby之后的结果,切片allbones字段,进行描述性统计
jili.groupby('dep')['allbones'].describe()

clipboard.png

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)

clipboard.png

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 x
jili.groupby('dep').apply(fun)

4、apply:

把计算的结果运用到原数据(看下图)
clipboard.png

5、高级用法

#组合为两层
jili.groupby(['dep','group']).mean()

#组合为两层后,只选allbones的值,然后再转换行列
jili.groupby(['dep','group'])['allbones'].sum().unstack()

clipboard.png

以上就是groupby的用法,之前跟着视频学过,但看书的话更详细,下节是透视表,拜拜。


xiaom
17 声望2 粉丝

数据科学进修之路。