Pandas(五):分组聚合

    科技2025-09-19  78

    点击跳转 《Pandas系列目录》


    文章目录

    1. groupby方法拆分数据2. agg方法聚合数据3. apply方法聚合数据4. transform方法聚合数据


    1. groupby方法拆分数据

    该方法提供的是分组聚合步骤中的拆分功能,能根据索引或字段对数据进行分组 DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)

    by参数的特别说明

    如果传入的是一个函数,则对索引进行计算并分组如果传入的是一个字典或者Series,则字典或Series的值用来做分组依据如果传入一个Numpy数组,则数据的元素作为分组依据如果传入的是字符串或者字符串列表,则使用这些字符串所代表的字段作为分组依据

    groupby对象常用的描述性统计方法

    用groupby方法分组后的结果并不能直接查看,而是被存在内存中,输出的是内存地址

    groupby对象常用的描述性统计方法

    import pandas as pd import numpy as np detail = pd.read_excel('...') detailGroup = detail[['order_id', 'counts', 'amounts']].groupby(by='order_id') print('分组后的订单详情表为:', detailGroup) # 打印地址 print(detailGroup.mean().head()) print(detailGroup.std().head()) print(detailGroup.size().head())

    2. agg方法聚合数据

    agg和aggregate函数参数及其说明

    agg、aggregate方法都支持对每个分组应用其函数,包括Python内置函数或自定义函数。同时这两个方法也能够直接对DataFrame进行函数应用操作

    在正常使用过程中,agg函数和aggregate函数对DataFrame对象操作时功能几乎完全相同,因此只需要掌握其中一个函数即可

    DataFrame.agg(func, axis=0, *args, **kwargs) DataFrame.aggregate(func, axis=0, *args, **kwargs)

    agg方法求统计量

    可以使用agg方法一次求出当前数据中所有菜品销量和售价的总和与均值

    detail[['counts', 'amounts']].agg([np.sum, np.mean])

    对于某个字段希望只做求均值操作,而对另一个字段则希望只做求和操作,可以使用字典的方式,将两个字段名分别作为key,然后将numpy库的求和与求均值的函数分别作为value

    detail.agg({'counts': np.sum, 'amounts': np.mean})

    在某些时候还希望求出某个字段的多个统计量,某些字段则只需要求一个统计量,此时只需要将字典对应key的value变为列表,列表元素为多个目标的统计量即可

    detail.agg({'counts': np.sum, 'amounts': [np.mean, np.sum]})

    agg方法与自定义函数

    在agg方法可传入自定义的函数 # 自定义函数求两倍的和 def DoubleSum(data): s = data.sum() * 2 return s print('菜品订单详情表的菜品销量两倍总和为:', '\n', detail.agg({'counts': DoubleSum}, axis=0)) 使用自定义函数需要注意的是numpy库中的函数np.mean,np.median,np.prod,np.sum,np.std,np.var能够在agg中直接使用,但是在自定义函数中使用numpy库中的这些函数,如果计算的时候是单个序列,则会无法得出想要的结果,如果是多列数据同时计算,则不会出现这种问题。因此尽量不要在自定义函数中使用np函数 # 自定义函数求两倍的和 def DoubleSum1(data): s = np.sum(data) * 2 return s print('订单详情表的菜品销量两倍总和为:\n', detail.agg({'counts': DoubleSum1}, axis=0).head()) # 不正常结果 print('订单详情表的菜品销量与售价的和的两倍为:\n', detail[['counts', 'amounts']].agg(DoubleSum1)) # 正常结果 使用agg方法能够实现对每一个字段每一组使用相同的函数agg方法能够对groupby对象进行操作 如果需要对不同的字段应用不同的函数,则可以和DataFrame中使用agg方法相同 print(detailGroup.agg(np.mean).head(3)) print(detailGroup.agg(np.std).head(3)) print(detailGroup.agg({'counts': np.sum, 'amounts': np.mean}).head(3))

    3. apply方法聚合数据

    apply方法类似agg方法能够将函数应用于每一列。不同之处在于,apply方法传入的函数只能够作用于整个DataFrame或者Series,而无法像agg一样能够对不同字段,应用不同函数,获取不同结果使用apply方法对groupby对象进行聚合操作,其方法和agg方法相同,只是agg方法能够实现对不同字段进行应用不同的函数,而apply不能 DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)

    print(detail[['counts', 'amounts']].apply(np.mean)) print(detailGroup.apply(np.mean).head(3)) print(detailGroup.apply(np.std).head(3))

    4. transform方法聚合数据

    transform方法能够对整个DataFrame的所有元素进行操作。且transform方法只有一个参数func,表示对DataFrame操作的函数

    print(detail[['counts', "amounts"]].transform(lambda x: x * 2).head(4))

    同时transform方法还能够对DataFrame分组后的对象groupby进行操作,可以实现组内离差标准化等操作

    print(detailGroup.transform(lambda x: (x.mean() - x.min()) / (x.max() - x.min())).head())

    若在计算离差标准化的时候结果中有NaN,这是由于根据离差标准化公式,最大值和最小值相同的情况下分母是0,而分母为0的数在Python中表示为NaN

    Processed: 0.009, SQL: 8