• pandas 学习 第15篇:分组 groupby


    DataFrame 和 Series 进行分组之后,会返回一个数据类型为GroupBy的对象。对数据进行分组之后,能够得到一个分组键和一个分组数据,一个分组对应的分组键是唯一的,分组是具有相同分组键的行或列的列表。

    一,groupby函数的基本原理

    这一节的内容引用于《Pandas教程 | 超好用的Groupby用法详解》,我强烈建议阅读原文,原文写的真棒。

    为了后续图解的方便,采用模拟生成的10个样本数据,代码和数据如下:

    1. company=["A","B","C"]
    2. data=pd.DataFrame({
    3. "company":[company[x] for x in np.random.randint(0,len(company),10)],
    4. "salary":np.random.randint(5,50,10),
    5. "age":np.random.randint(15,50,10)
    6. }
    7. )

    pandas中,实现分组操作的代码很简单,仅需一行代码,在这里,将上面的数据集按照company字段进行划分:

    group = data.groupby("company")
    

    将上述代码输入ipython后,会得到一个DataFrameGroupBy对象

    <pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002B7E2650240>
    

    那这个生成的DataFrameGroupBy是啥呢?对data进行了groupby后发生了什么?ipython所返回的结果是其内存地址,并不利于直观地理解,为了看看group内部究竟是什么,这里把group转换成list的形式来看一看:

    1. In [8]: list(group)
    2. Out[8]:
    3. [('A', company salary age
    4. 3 A 20 22
    5. 6 A 23 33),
    6. ('B', company salary age
    7. 4 B 10 17
    8. 5 B 21 40
    9. 8 B 8 30),
    10. ('C', company salary age
    11. 0 C 43 35
    12. 1 C 17 25
    13. 2 C 8 30
    14. 7 C 49 19)]

    转换成列表的形式后,可以看到,列表由三个元组组成,每个元组中,第一个元素是组别(这里是按照company进行分组,所以最后分为了A,B,C),第二个元素的是对应组别下的DataFrame,整个过程可以图解如下:

    总结来说,groupby的过程就是将原有的DataFrame按照groupby的字段(这里是company),划分为若干个分组DataFrame,被分为多少个组就有多少个分组DataFrame。所以说,在groupby之后的一系列操作(如aggapply等),均是基于子DataFrame的操作。理解了这点,也就基本摸清了Pandas中groupby操作的主要原理。下面来讲讲groupby之后的常见操作。

    二,groupby 函数

    对序列或DataFrame对象进行分组,返回分组之后的对象,并可以调用聚合函数获得每个分组的聚合值:

    1. DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, dropna=True)
    2. Series.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, dropna=True)

    参数注释:

    • by:用于对序列进行分组,参数by的值可以是函数,列名或列名列表,映射
    • axis:0表示index,1表示columns,默认值是0,按照行(0)或列(1)进行拆分
    • level:对于多维索引,按照索引的级别来分组,默认值是0
    • as_index:对于聚合输出,返回的GroupBy对象把分组标签作为索引
    • group_keys:当调用apply函数时,把分组键(group keys)作为索引来区分分组
    • dropna:如果设置为True,当分组键包含NA时,把包含NA的分组键以及对应的值删除掉。

    1,by是列名

    如果by是标签列表,通常是按照列值来对数据进行分组,通常用于数据框(DataFrame)中,按照分组列,对每个列的值进行聚合运算:

    1. >>> df = pd.DataFrame({'Animal': ['Falcon', 'Falcon', 'Parrot', 'Parrot'],
    2. ... 'Max Speed': [380., 370., 24., 26.],
    3. ... 'Max Age': [38, 30, 20, 16]})
    4. >>> df.groupby(['Animal']).mean()
    5. Max Speed Max Age
    6. Animal
    7. Falcon 375.0 34
    8. Parrot 25.0 18

    2,by是映射(序列)

    当使用序列作为映射时,by序列的值用于对原始序列进行分组,by序列中相同的值对应着原始序列的值属于同一个分组;原始序列和by序列进行匹配的方法是索引对齐。

    1. >>> s.groupby(by=pd.Series(data=[1,2,1,1],index=[0,2,3,1])).mean()
    2. 1 2.333333
    3. 2 3.000000
    4. dtype: float64

    索引对齐是怎么回事?

    对于by参数的序列,数据是1, 2, 1, 1,这意味着,把原始序列分为2组,分组的key分别是1和2。

    by序列的索引是0, 2, 3, 1,也就是说,当原始序列的索引为0, 3, 1 时,对应的分组key是1,当原始序列的索引为2时,对应的分组key是2。

    索引对齐之后,原始序列中的值1,2,4属于分组1;原始序列中的值3属于分组2,再计算每个分组的均值。

    三,GroupBy对象

    GroupBy对象是由函数Series.groupby() 或 DataFrame.groupby()返回的对象,GroupBy对象有两个熟悉:groups和indices。

    groups是字典结构,表示所有的分组:Dict {group name -> group labels}

    indices是字典结构,表示分组的索引键:Dict {group name -> group indices},也就是groupby函数中by参数设置的字段的值。

    举个例子:

    1. >>> df = pd.DataFrame({'Animal': ['Falcon', 'Falcon', 'Parrot', 'Parrot'],
    2. ... 'Max Speed': [380., 370., 24., 26.],
    3. ... 'Max Age': [38, 30, 20, 16]})
    4. >>> gb = df.groupby(['Animal'])

    gb 就是 GroupBy对象,该对象的属性groups是一个字典结构,key是分组键,值是分组键对行的索引构成的列表。

    1. >>> gb.groups
    2. {'Falcon': Int64Index([0, 1], dtype='int64'), 'Parrot': Int64Index([2, 3], dtype='int64')}

    对每个分组,可以计算聚合值,计算相关性等操作,详细操作,可以阅读官方手册 GroupBy

    参考文档:

    Pandas教程 | 超好用的Groupby用法详解

    pandas.DataFrame.groupby

    GroupBy

  • 相关阅读:
    Java 异常处理详解(如果想知道Java中有关异常处理的知识点,那么只看这一篇就足够了!)
    安卓毕业设计选题app毕业论文基于Uniapp实现的Android的餐饮管理系统
    智慧工地安全施工实时监测系统解决方案
    ts学习04-Es5中的类和静态方法 继承
    网络设置、ssh服务
    论文精度 —— 2017 ACM《Globally and Locally Consistent Image Completion》
    激光SLAM多层料箱机器人HEGERLS A42M SLAM|灵活匹配多种作业高度|支持多尺寸纸箱/料箱混合拣选
    pychon/PIL/opencv学习过程中遇到的问题
    [附源码]SSM计算机毕业设计网上鞋店管理系统JAVA
    刷题笔记之二(字符串中找出连续最长的数字串+数组中出现次数超过一半的数字+另类加法+计算糖果+进制转换)
  • 原文地址:https://blog.csdn.net/upluck/article/details/126108641