数据分析--pandas--使用分组聚合进行组内计算

1 使用 groupby 方法拆分数据

先来看一张图:
在这里插入图片描述
groupby 方法的参数及其说明:
该方法提供的是分组聚合步骤中的拆分功能,能根据索引或字段对数据进行分组。其常用参数与使用格式如下。

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)

在这里插入图片描述
groupby 方法的参数及其说明——by 参数的特别说明:

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

GroupBy 对象常用的描述性统计方法:
用 groupby 方法分组后的结果并不能直接查看,而是被存在内存中,输出的是内存地址。实际上分组后的数据对象 GroupBy 类似 Series 与DataFrame,是 pandas 提供的一种对象。GroupBy 对象常用的描述性统计方法如下:
在这里插入图片描述

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 方法可传入读者自定义的函数。
  • 使用自定义函数需要注意的是 NumPy 库中的函数 np.mean,np.median,np.prod,np.sum,
    np.std,np.var 能够在 agg 中直接使用,但是在自定义函数中使用 NumPy 库中的这些函数,如果计算的时候是单个序列则会无法得出想要的结果,如果是多列数据同时计算则不会出现这种问题。
  • 使用 agg 方法能够实现对每一个字段每一组使用相同的函数。
  • 如果需要对不同的字段应用不同的函数,则可以和 Dataframe 中使用 agg 方法相同。

3使用 apply 方法聚合数据:

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

在这里插入图片描述

4使用 transform 方法聚合数据:

  • transform 方法能够对整个 DataFrame 的所有元素进行操作。且 transform 方法只有一个参数“func”,表示对 DataFrame 操作的函数。
  • 同时 transform 方法还能够对 DataFrame 分组后的对象 GroupBy 进行操作,可以实现组内离差标准化等操作。
  • 若在计算离差标准化的时候结果中有 NaN,这是由于根据离差标准化公式,最大值和最小值相同的情况下分母是 0。而分母为 0 的数在 Python 中表示为 NaN。

Example:

import pandas as pd
import numpy as np

#读取数据
detail = pd.read_excel('output.xlsx',sheetname=0)

#group
lite_detail = detail[['order_id','counts','amounts','dishes_name']]
detail_group =lite_detail.groupby(by='order_id')

print(detail_group['order_id'])

#group数据分析
print('每个订单的均值:\n',detail_group.mean().head())
print('每个订单的标准差:\n',detail_group.std().head())
print('每个订单的大小为:\n',detail_group.size().head())

# 任务
task_detail = detail[['dishes_name','amounts']]
detail_group = task_detail.groupby(by='dishes_name')
#任务数据分析
print(detail_group.mean())
print(detail_group.size().tail())

#2.agg---对于不同的列使用不同的聚合函数
#(1)一次性进行多个聚合统计
# a.所有列都执行聚合操作
lite_detail = detail[['counts','amounts']]
print('菜品销量和售价的均值:\n',lite_detail.agg([np.sum,np.mean]))

#b.指定列执行指定聚合操作
print('菜品销量总和 与 售价的均值:\n',lite_detail.agg({'counts':[np.sum,np.std],'amounts':np.mean}))

#c.可自定义聚合操作
def double_sum(col):
    return col*2

print('数据分析操作:\n')
print(lite_detail.agg({'counts':double_sum},axis = 0))

print(detail[['counts','amounts']].agg(double_sum))

#apply
#每列均值
print('订单详情表的菜品销量与售价的均值:\n',detail[['counts','amounts']].apply(np.mean))

#每组均值
new_detail = detail[['order_id','counts','amounts']].groupby(by='order_id')
print(new_detail)#DataFrameGroupBy
print('订单详情表中分组后每组的均值:\n',new_detail.apply(np.mean).head())
print('订单详情表中分组后每组的标准差:\n',new_detail.apply(np.std).head())
#
# 3.transform
print('订单详情表中菜品销量与售价的两倍:\n',detail[['counts','amounts']].transform(lambda x:2*x))
#
print('(分组后)订单详情表中菜品销量与售价的两倍:\n',new_detail.transform(lambda x:2*x))


#离差标准化:消除大单位和小单位的影响(消除量纲)变异大小的差异影响
# (当前值-最小值)/(最大值-最小值)

# def aa(x):
#     # print(type(x),x)#输出x是一个序列
#     fenzi = x-x.min()
#     fenmu = x.max() - x.min()
#
#     print(fenzi/fenmu)
#     print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')

print('订单详情表分组后实现组内离差标准化:\n',new_detail.transform(lambda x:(x-x.min())/(x.max()-x.min()) ))



















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值