当前位置:   article > 正文

Pandas.DataFrame.groupby() 数据分组(数据透视、分类汇总) 详解 含代码 含测试数据集 随Pandas版本持续更新_dataframe 分类汇总

dataframe 分类汇总

关于Pandas版本: 本文基于 pandas2.2.0 编写。

关于本文内容更新: 随着pandas的stable版本更迭,本文持续更新,不断完善补充。

传送门: Pandas API参考目录

传送门: Pandas 版本更新及新特性

传送门: Pandas 由浅入深系列教程

Pandas.DataFrame.groupby()

DataFrame.groupby() 方法用于使用映射器或指定的列,对 DataFrame 进行数据分组,可以实现类似Excel的数据透视、分类汇总的效果。

  • DataFrame.groupby() 的底层逻辑是:

    • 1、根据指定的规则(由 by 参数指定)分割 DataFramegroupby 对象;
      • 此时只是完成了 DataFrame 分割,仅仅是一个 groupby 对象,还没有完成汇总。这意味着无法像观察 DataFrame 一样观察它:
      • 可以使用 for 循环观察groupby 对象。 例1
      • 用于分组的分类内容,默认会作为这个新 DataFrame 的索引(行索引,或列名,具体视汇总方向而定)。例2-5
    • 2、应用指定的方法,汇总、聚合被分割的数据。
      • 如果应用一种汇总计算方法,所有列都是用一种汇总方法进行聚合。例2
      • 也可以通过 DataFrame.agg 指定不同的列使用不同的计算方法作为汇总方式。例2-4
    • 3、应用聚合方法之后,DataFrame.groupby() 会自动的将聚合后的数据合并为新的 DataFrame

    ⚠️ 注意:

    1、数据分割实际上是基于行索引进行的。

    2、你指定的分割依据(分组依据)需要尽可能的,和行索引等长。

数据分组流程示意图

数据分组流程示意图

语法:

DataFrame.groupby (by=None, axis=_NoDefault.no_default, level=None, as_index=True, sort=True, group_keys=True, observed=_NoDefault.no_default, dropna=True)

返回值:

  • pandas.api.typing.DataFrameGroupBy
    • 返回包含分组信息的 groupby 对象。

参数说明:

by 指定分组依据

  • **by:**mapping, function, label, pd.Grouper or list of such

    by 参数用于指定分组的依据(即分割DataFrame的依据):

    • label(列名):用于把某列指定为分组依据

      • 当某列的数据具有分类特性,指定这个列的列名,作为分组依据 DataFrame例1
    • mapping(映射):用于直接把行索引的值指定为分组依据

      • dict(字典):适用于行索引的值可以拿来做分组(常用于分组名称的重命名) 例3
        • 传递一个字典,字典的键是行索引里的可以作为分组的值,字典的值你自定义的分组名;
        • 注意!如果只传递字典,你需要提前准备好行索引。并且行索引里的值,应该是可以有效分组的。
      • Series(序列):适用于你有一个和 DataFrame 行索引等长的 Series 例4
        • 这个 Series 里的值,应该是可以有效分组的;
        • 这个 Series 建议和 DataFrame 行索引等长;
        • 如果这个Series 必须和 DataFrame 行索引不等长,会自动进行对齐(.align()),二者数据量如果差距太大,会产生很多缺失值,造成分组后计算不精准的结果。
    • function(函数): 函数将作用于行索引的每个值,并使用处理后的值,作为分组依据。 例5

      • 行索引中被函数处理后的值,并不会影响计算前的 groupby 对象。例5-1
      • 行索引中被函数处理后的值,将展示在完成分组计算,合并后的 DataFrame例5-2
    • pd.Grouper:通常用于按照时间间隔分组,直接作用于行索引 例6

    • list of such:多个列构成多维度分组汇总

      • 列名列表: 常用于多维度分组汇总,列表里的第1个列名,默认作为顶层行索引,和其他列名构成多层索引。 例7

axis 指定分割方向

  • axis: {0 or ‘index’, 1 or ‘columns’}, default 0

    axis 参数用于指定分割方向(可以参照此图,了解什么是分割 数据分组流程示意图):

    • 0 or ‘index’: 默认为按行索引分割。
    • 1 or ‘columns’: 按列分割。

    弃用于 Pandas 2.1.0 :

    • axis=1Pandas 2.1.0 版本标记为弃用。使用以下替代方法实现:

      • 先 转置 再 分组 frame.T.groupby(...) 例8
    • 这样做的目的是:使分组后数据尽可能的保持更多的操作性和可读性。

level 指定多层索引的层级编号或层级名称

  • level: int, level name, or sequence of such, default None 例9

    如果 DataFrame 具有多层索引,可以用level参数指定级别的编号或名称,不能和 by 参数同时使用。

    • int:整数层级编号 可以用 整数层级编号 指定分组依据。例9-2
    • level name:层级名称 可以用层级名称, 指定分组依据。例9-2
    • sequence of such:层级编号列表,或层级名称列表 可以用层级编号列表,或层级名称列表指定多个分组依据,类似于 by 参数传递列名列表。例9-3

as_index 排序方法(升序或降序)

  • as_index: bool, default True 例10

    as_index 参数控制是否将组标签作为索引返回。

    • as_index=True 时,组标签将成为输出 DataFrame 的索引。
    • as_index=False 时,组标签不会成为索引,而是返回一个类似 SQL 风格的输出。

sort 是否对组名排序

  • sort: bool, default True 例11

    sort 参数用于控制是否对分组名进行排序,默认 sort=True 会对组名进行排序。此参数不会影响每个组内观察值的顺序:

    • True:分组名进行排序。
    • False: 关闭分组名排序,如果关闭,则组将按其在原始 DataFrame 中的顺序显示,可以获得更高的性能。

    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/153149
推荐阅读
相关标签