聚合
aggregate = 合并,聚集在一起 = agg( )
什么情况下进行使用:
1. 需要对某个对象使用多个函数时: gb.agg([ "函数1", “函数2”,…… ])
2. 需要使用自己定义的函数时
3. 针对不同的列名,使用不同的函数
使用的思路:
1. gb代表分组之后的对象
gb = df.groupby(["分组依据",……])["待操作的列表头类别", ……]
(这里不写具体的操作,因为要对在下面进行具体操作)
2. 形成DataFrame结构
3. 使用聚合函数操作的方法逐一在gb进行操作
针对不同的使用方法进行阐述:
-
对同一对象的不同类别应用全部使用相同的多个函数
gb.agg( ["函数1", "函数2", "函数3", ……] )
实战代码:
import pandas as pd
path = r"F:\Python_Tensorflow_codes\001竞赛代码\joyful-pandas-master\data\learn_pandas.csv"
df = pd.read_csv(path, encoding="gbk")
gb = df.groupby("Gender")[["Height", "Weight"]]
print(gb.agg(["sum", "idxmax", "skew"]))
运行结果:
Height Weight
sum idxmax skew sum idxmax skew
Gender
Female 21014.0 28 -0.219253 6469.0 28 -0.268482
Male 8854.9 193 0.437535 3929.0 2 -0.332393
-
对同一对象的不同类别使用不同的函数
gb.agg({"列表头类别1" : ["函数1", "函数2",……],"列表头类别2" : [ 同上 ], …… })
代码实战:
print(gb.agg({"Height": ["mean", "max"], "Weight": "count"}))
运行结果:
Height Weight
mean max count
Gender
Female 159.19697 170.2 135
Male 173.62549 193.9 54
-
对同一对象的不同类别使用相同的自定义函数
gb.agg( 自定义 函数名 )
代码实战1:
print(gb.agg(lambda x:x.mean()-x.min()))
运行结果1:
Height Weight
Gender
Female 13.79697 13.918519
Male 17.92549 21.759259
代码实战2:
def my_func(s):
res = "high"
if s.mean() <= df[s.name].mean():
res = "low"
return res
gb.agg(my_func)
运行结果2:
Height Weight
Gender
Female low low
Male high high
聚合函数使用之后的对结果重命名:
只需要将上述函数的位置改写成元组,元组的第一个元素为新的名字,第二个位置为原来的函数,包括聚合字符串和自定义函数。
简化表达:
gb.agg( [(新名字,原来的函数) ,(新名字,原来的函数) ] )
代码实战3:
print(gb.agg([("range", lambda x:x.mean()-x.min()), ("my_sum", "sum")]))
运行结果3:
Height Weight
range my_sum range my_sum
Gender
Female 13.79697 21014.0 13.918519 6469.0
Male 17.92549 8854.9 21.759259 3929.0
代码实战4:
print(gb.agg([("my_new_func", my_func)]))
运行结果4:
Height Weight
my_new_func my_new_func
Gender
Female low low
Male high high
-
对同一对象的不同类别使用不同的自定义函数
使用方法:gb.agg({"列表头类别1":[自定义函数名1, ……] , "列表头类别2":[ 自定义函数名2, ……] })
代码实战5:
print(gb.agg({'Height':[my_func,'max'], 'Weight':lambda x:x.mean()-x.min()}))
运行结果5:
Height Weight
my_func max <lambda>
Gender
Female low 170.2 13.918519
Male high 193.9 21.759259
对上述代码进行一定的修改:
print(gb.agg({'Height':[my_func,'max'], 'Weight':("range",lambda x:x.mean()-x.min())}))
运行结果:
Height Weight
my_func max range
Gender
Female low 170.2 13.918519
Male high 193.9 21.759259
注意:
中括号 [ ] 括起来的是 函数、类别
小括号 () 括起来后的是 (新函数名, 原函数名)
大括号 { key : value}针对的是 不同类别使用不同的函数
注意这3种符号的嵌套
变换
transform = 转换,变换,使……改变形态,使……改变外观(或性质)
变换函数的返回值为同长度的序列
有一些内置的变换函数为 累计函数 :(cumcount / cumsum / cumprod / cummax / cummin)
使用方法:同 聚合函数使用方式一致。
代码实战:
print(gb.transform(lambda x: (x - x.mean()) / x.std()).head())
运行结果:
Height Weight
0 -0.058760 -0.354888
1 -1.010925 -0.355000
2 2.167063 2.089498
3 NaN -1.279789
4 0.053133 0.159631
过滤
filter = 过滤 ( 进行组的筛选 )
过滤在分组中是对于组的过滤,而索引是对于行的过滤
代码实战:
print(gb.filter(lambda x: x.shape[0] > 100).head())
运行结果:
Height Weight
0 158.9 46.0
3 NaN 41.0
5 158.0 51.0
6 162.5 52.0
7 161.9 50.0