一、分组模式及其对象
例子:依据 季节 分组,求每一个季节的 温度 的均值
想要实现分组操作,必须明确三个要素:分组依据 、 数据来源 、 操作及其返回结果
df.groupby(分组依据)[数据来源].使用操作
例子则可以表现为:
#依据 季节 分组,求每一个季节的 温度 的均值
df.groupby('jijie')['shuju'].mean()
#依据性别分组统计身高中位数
df.groupby('Gender')['Height'].median()
#根据多维进行分组
#例:根据学校和性别进行分组,统计身高的均值
df.groupby(['School', 'Gender'])['Height'].mean()
#例:根据学生体重是否超过总体均值来分组,再计算身高的均值。
condition = df.Weight > df.Weight.mean()
df.groupby(condition)['Height'].mean()
Out[7]:
Weight
False 159.034646
True 172.705357
分组的三大操作:聚合、变换和过滤
二、聚合函数
max/min/mean/median/count/all/any/idxmax/idxmin/mad/nunique/skew/quantile/sum/std/var/sem/size/prod
五、练习
第一题
1.先过滤出所属 Country 数超过2个的汽车,即若该汽车的 Country 在总体数据集中出现次数不超过2则剔除,再按 Country 分组计算价格均值、价格变异系数、该 Country 的汽车数量,其中变异系数的计算方法是标准差除以均值,并在结果中把变异系数重命名为 CoV。
df = pd.read_csv('数据')
df.head(10)
#剔除filter ,agg计算多个返回值
df.groupby('Country').filter(lambda x:x.shape[0]>2).groupby('Country')['Price'].agg([('coV',lambda x:x.std()/x.men()),'mean','count'])
2.按照表中位置的前三分之一、中间三分之一和后三分之一分组,统计 Price 的均值。
df.shape[0] #60
#分割表中位置的方法
condition = ['HEad']*20+['Mid']*20+['Tail']*20
df.groupby(condition)['Price'].mean()
3,对类型 Type 分组,对 Price 和 HP 分别计算最大值和最小值,结果会产生多级索引,请用下划线把多级列索引合并为单层索引。
res=df.groupby('Type').agg({'Price':['max'],'HP':['min']})
#agg的使用
#map()函数
res.columns = res.columns.map(lambda x:'_'.join(x))
res
Price_max HP_min
Type
Compact 18900 95
Large 17257 150
Medium 24760 110
Small 9995 63
Sporty 13945 92
Van 15395 106
4.对类型 Type 分组,对 HP 进行组内的 min-max 归一化。
def normalize(s):
s_min,s_max = s.min(),s.max()
res = (s-s_min)/(s_max-s_min)
return res
#定义标准化函数
df.groupby('Type')['HP'].transform(normalize).head()
5,对类型 Type 分组,计算 Disp. 与 HP 的相关系数。
df.groupby('Type')[['HP','Disp.']].apply(lambda x:np.corrcoef(x['HP'].values,x['Disp.'].values)[0,1])
第二题