zoukankan      html  css  js  c++  java
  • 5-Pandas数据分组与聚合(df.Groupby())

    GroupBy技术是对于数据进行分组计算并将各组计算结果合并的一项技术,包括以下3个过程:

    1. 拆分(Spliting):即将数据进行分组
    2. 应用(Applying):对每组应用函数进行计算
    3. 合并(Combining):将计算结果进行数据聚合

    使用GroupBy()可以沿着任意轴进行分组,并且将分组依据的键作为每组的组名,有一下3种用法:

    1. df.groupby(key)
    2. df.groupby(key,axis=1)
    3. df.groupby([key1,key2])

    注:key需要用""引起来

      其中的参数axis,可设置是横向分组还是纵向分组,默认是横向分组(axis=0),也是比较常用的。

    >>> import pandas as pd
    >>> import numpy as np
    >>> df = pd.read_excel('./input/class.xlsx')
    >>> df
      class     sex  score_math  score_music
    0     A    male          95           79
    1     A  female          96           90
    2     B  female          85           85
    3     C    male          93           92
    4     B  female          84           90
    5     B    male          88           70
    6     C    male          59           89
    7     A    male          88           86
    8     B    male          89           74
    
    #使用groupby()按照class进行分组,返回的结果是一个GroupBY对象,即拆分过程
    >>> df.groupby('class')
    <pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000024D18D73DA0>
    

      分组时所依据的键的唯一值作为索引,且当传入多个值时将产生层次化索引 

    >>> df.groupby('class').sum()
           score_math  score_music
    class
    A             279          255
    B             346          319
    C             152          181
    
    >>> df.groupby(['class','sex']).mean()
                  score_math  score_music
    class sex
    A     female        96.0         90.0
          male          91.5         82.5
    B     female        84.5         87.5
          male          88.5         72.0
    C     male          76.0         90.5
    

      在分组时除了传入列表,也可传入一个对于对象行或列长度一致的数组。(并不常用)

    例:求按性别分组的各课程平均分,传入性别使用中文表示的一个数组

    >>> arr = np.array(['男','女','女','男','女','男','男','男','男'])
    >>> df.groupby(arr).mean()
       score_math  score_music
    女   88.333333    88.333333
    男   85.333333    81.666667
    

      .count()函数可统计各组样本数量,.idxmax()函数可返回最大值的索引

     

    #按照class和sex分组后各组样本的数量
    >>> df.groupby(['class','sex']).count()
                  score_math  score_music
    class sex
    A     female           1            1
          male             2            2
    B     female           2            2
          male             2            2
    C     male             2            2
    
    ##按照class和sex分组后最大值的索引
    >>> df.groupby(['class','sex']).idxmax()
                  score_math  score_music
    class sex
    A     female           1            1
          male             0            7
    B     female           2            4
          male             8            8
    C     male             3            3
    
    >>> df.groupby(['class','sex']).count().idxmax()
    score_math     (A, male)
    score_music    (A, male)
    dtype: object
    
    #按照class和sex分组后样本数量最多的索引
    >>> df.groupby(['class','sex']).count().idxmax()[0]
    ('A', 'male')
    

      

  • 相关阅读:
    开发实践思考(一)
    记一次前端适配后台接口改造的开发小结
    百度地图AK申请
    Idea 不更新pom.xml中的jar包
    java junit @Test 变量共享问题 --springboot 中的Controller静态变量可以共享
    Java如何对HashMap按值进行排序--非String int 类型时
    Salesforce Integration 概览(七) Data Virtualization数据可视化
    Salesforce Integration 概览(六) UI Update Based on Data Changes(UI自动更新基于数据变更)
    Salesforce Integration 概览(五) Remote Call-In(远程操作 外部->salesforce)
    Salesforce Integration 概览(四) Batch Data Synchronization(批量数据的同步)
  • 原文地址:https://www.cnblogs.com/Cheryol/p/13442473.html
Copyright © 2011-2022 走看看