5-Pandas数组分组的高级方法(使用字典、函数、层次化索引级别)
数据分组的高级方法有3种:
- 通过字典进行分组
- 通过函数进行分组
- 根据层次化索引级别进行分组
一、根据字典进行分组
若希望按照特征类别进行分组,可创建一个映射字典
>>> df = pd.read_excel('./input/data1.xlsx') >>> df A_male B_female C_female D_male 0 87 89 97 95 1 68 90 94 89 2 89 83 96 85 3 66 84 90 82 #创建一个映射字典 >>> mapper = {'A_male':'Male','B_female':'Female','C_female':'Female','D_male':'Male'} #通过传入硬着字典,指定分组依据位于列上,对不同类别的特征进行分组 >>> grouped = df.groupby(mapper,axis=1) #获取分组信息 >>> grouped.get_group('Male') A_male D_male 0 87 95 1 68 89 2 89 85 3 66 82 >>> grouped.get_group('Female') B_female C_female 0 89 97 1 90 94 2 83 96 3 84 90 #先对各组数据按照横向轴进行计算 >>> grouped.mean() Female Male 0 93.0 91.0 1 92.0 78.5 2 89.5 87.0 3 87.0 74.0 #在上一步的基础上,按照纵向轴进行计算 >>> grouped.mean().mean() Female 90.375 Male 82.625 dtype: float64
二、根据函数进行分组
假设对行索引进行分组,可以自定义一函数:当索引值为3时,返回 False ;当索引部位3时返回True;
注意:使用函数对数据进行分组时,函数输入的是数据的索引列
>>> map_fuc = lambda x:bool(3-x) >>> grouped = df.groupby(map) >>> for name,group in grouped: ... print(name) ... print(group) ... print('-'*40) ... False A_male B_female C_female D_male 3 66 84 90 82 ---------------------------------------- True A_male B_female C_female D_male 0 87 89 97 95 1 68 90 94 89 2 89 83 96 85 ----------------------------------------
三、根据层次化索引进行分组
先创建一个存在层次化索引的DataFrame对象,如下:
>>> hier_df = pd.DataFrame([[78,85],[89,96],[88,94],[90,95]],columns=['math','music'],index=[['A','B','B','C'],['male','female','male','female']]) >>> hier_df math music A male 78 85 B female 89 96 male 88 94 C female 90 95 >>> hier_df.index.names=['class','sex'] >>> hier_df math music class sex A male 78 85 B female 89 96 male 88 94 C female 90 95
当DataFrame对象存在层次化索引之时可以通过参数level指定不同索引级别进行分组与聚合;也可以直接指定列无需指定level
上述例子中的class索引的level=0,sex索引的level=1
>>> hier_df.groupby(level=0).mean() math music class A 78.0 85.0 B 88.5 95.0 C 90.0 95.0 >>> hier_df.groupby('sex').mean() math music sex female 89.5 95.5 male 83.0 89.5 #与直接指定列效果一致 >>> hier_df.groupby(level=1).mean() math music sex female 89.5 95.5 male 83.0 89.5
在分组结果中,若不想分组的键当做索引,设置as_index = Fasle即可,默认的as_index = True
>>> hier_df.groupby(level=1,as_index=False).mean() math music 0 89.5 95.5 1 83.0 89.5