数据分组的高级方法有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