文章目录
1. 分组模式及其对象
1.1 分组的一般模式
df.groupby(分组依据)[数据来源].使用操作
实例df.groupby('Gender')['Height'].mean()
-
单一维度分组
df.groupby('Gender')['Height'].mean()
-
多维度分组
df.groupby(['School', 'Gender'])['Height'].mean()
-
复杂逻辑分组
df.groupby(df.Weight > df.Weight.mean())['Height'].mean()
1.2 Groupby对象
gb = df.groupby(['School', 'Grade'])
gb.ngroups
,分组个数gb.groups
,返回从组名组名映射到组索引列表组索引列表的字典gb.size()
,统计每个组的元素个数gb.get_group(('values1','values2'))
,获取所在组对应的行
1.3 分组的三大操作
分组的三大操作:聚合、变换和过滤(agg、
transform和
filter)
- 依据性别性别分组,统计全国人口寿命寿命的平均值平均值,每一个组返回一个标量值
- 依据季节季节分组,对每一个季节的温度温度进行组内标准化组内标准化,每组返回的是一个
Series
类型 - 依据班级班级筛选出组内数学分数数学分数的平均值超过80分的班级,返回的整个组所在行的本身,即返回了
DataFrame
类型
2.聚合函数
2.1 内置聚合函数
- 内置聚合函数
max/min/mean/median/count/all/any/idxmax/idxmin/mad/nunique/skew/quantile/sum/std/var/sem/size/prod
聚合函数当传入的数据来源包含多个列时,将按照列进行迭代计算
2.2 agg方法
gb = df.groupby('Grade')[['Height', 'Weight']]
gb.agg(['sum', 'idxmax', 'skew'])
,同时使用多个聚合函数;用列表的形式把内置聚合函数对应的字符串传入gb.agg({'Height':['mean','max'], 'Weight':'count'})
,对特定的列使用特定的聚合函数;以列名为键,以聚合字符串或字符串列表为值- 使用自定义的聚合函数
gb.agg(lambda x: x.mean()-x.min())
,需要注意传入函数的参数是之前数据源中的列,逐列进行计算gb.agg(my_func)
- 对聚合结果的列名进行自定义命名
gb.agg([('range', lambda x: x.max()-x.min()), ('my_sum', 'sum')])
,函数的位置改写成元组,元组的第一个元素为新的名字,第二个位置为原来的函数gb.agg({'Height': [('my_func', my_func), 'sum'], 'Weight': [('range', lambda x:x.max())]})
,对一个或者多个列使用单个聚合的时候,重命名需要加方括号,例如“Weight”
3.变换与过滤
3.1 变换函数与transform方法
- 内置变换函数是累计函数:
cumcount/cumsum/cumprod/cummax/cummin
,变换函数的返回值为同长度的序列,完成的是组内累计操作 gb.transform(lambda x: (x-x.mean())/x.std())
,用自定义变换时需要使用transform
方法,被调用的自定义函数,其传入值为数据源的序列,其最后的返回结果是行列索引与数据源一致的DataFrame
3.2 组索引与过滤
过滤在分组中是对于组的过滤,而索引是对于行的过滤
gb.filter(lambda x: x.shape[0] > 100)
,组的筛选,其中自定义函数的输入参数为数据源构成的DataFrame
本身
4.跨列分组
4.1 apply函数
解决多列数据同时处理的计算
-
返回标量
def BMI(x): Height = x['Height']/100 Weight = x['Weight'] BMI_value = Weight/Height**2 return BMI_value.mean() gb.apply(BMI)
-
返回一维
Series
-
标量情况:结果得到的是
Series
,索引与agg
的结果一致gb = df.groupby(['Gender','Test_Number'])[['Height','Weight']]
gb.apply(**lambda** x: 0)
-
-
返回二维
DataFrame
-
Series
情况:得到的是DataFrame
,行索引与标量情况一致,列索引为Series
的索引gb.apply(lambda x: pd.Series([0,0],index=['a','b']))
-
DataFrame
情况:得到的是DataFrame
,行索引最内层在每个组原先agg
的结果索引上,再加一层返回的DataFrame
行索引,同时分组结果DataFrame
的列索引和返回的DataFrame
列索引一致gb.apply(lambda x: pd.DataFrame(np.ones((2,2)), index = ['a','b'], columns=pd.Index([('w','x'),('y','z')])))
-