Pandas(五):分组聚合

点击跳转
《Pandas系列目录》



tenSxJ.png

1. groupby方法拆分数据

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

tenKsA.png

  • by参数的特别说明

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

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

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

      tenyJU.png

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)
        

    teupY8.png

  • 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)

teKnHI.png

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值