5-Pandas数组分组的高级方法(使用字典、函数、层次化索引级别)

数据分组的高级方法有3种:

  1. 通过字典进行分组
  2. 通过函数进行分组
  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

  

 

posted @ 2020-08-05 22:56  大脸猫12581  阅读(545)  评论(0编辑  收藏  举报