zoukankan      html  css  js  c++  java
  • 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
    

      

  • 相关阅读:
    由“Jasperrpeorts 4.1.2升级到5.1.2对flex项目的解析”到AS3 带命名空间的XML的操作
    c++里的类型转化
    A股市场暴跌背后的三大元凶?
    jQuery简单过滤选择器
    Handling of asynchronous events---reference
    NMAP
    JVM Run-Time Data Areas--reference
    Getting over the dangers of rm command in Linux---reference
    45 Useful Oracle Queries--ref
    手动修改user-agent
  • 原文地址:https://www.cnblogs.com/Cheryol/p/13443383.html
Copyright © 2011-2022 走看看