pandas——分组与聚合

1.使用groupby方法拆分数据

groupby方法的参数及其说明

该方法提供的是分组聚合步骤中的拆分功能,能根据索引或字段对数据进行分组。

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

参数说明 说明
by 接收list,string,mapping或generator。用于确定进行分组的依据。无默认。
axis 接收int。表示操作的轴向,默认对列进行操作。默认为0。
level 接收int或者索引名。代表标签所在级别。默认为None。
as_index 接收boolearn。表示聚合后的聚合标签是否以DataFrame索引形式输出。默认为True
sort 接收boolearn。表示是否对分组依据分组标签进行排序。默认为True。
group_keys 接收boolearn。表示是否显示分组标签的名称。默认为True。
squeeze 接收boolearn。表示是否在允许的情况下对返回数据进行降维。默认为False。

groupby方法的参数及其说明——by参数的特别说明

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

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

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

方法名称 说明 方法名称 说明
count 计算机分组的数目,包括缺失值 enzuznecumcount 对每个分组中组员的进行标记,
0至n-1。
head 返回每组的前n个值 size 返回每组的大小
max 返回每组的最大值 min 返回每组的最小值
mean 返回每组的均值 std 返回每组的标准差
median 返回每组的中位数 sum 返回每组的和

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)

参数名称 说明
func 接收list、dict、function。表示应用于每行/每列的函数。无默认。
axis 接收0或1。代表操作的轴向。默认为0

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)

参数名称 说明
func 接收functions。表示应用于每行/列的函数。无默认。
axis 接收0或1。代表操作的轴向。默认为0。
broadcast 接收boolearn。表示是否进行广播。默认为False
raw 接收boolearn。表示是否直接将ndarray对象传递给函数。默认为False
reduce 接收boolearn或者None。表示返回值的格式。默认None。

4.使用transform方法聚合数据

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

import pandas as pd
import numpy as np
detail = pd.read_excel('./meal_order_detail.xlsx')
# print('detail',detail)
#
# ###分组
# ##以amounts分组-统计所有列的平均值
de = detail.groupby(by='amounts').mean()
print(de)

### 以amounts分组,求出counts的均值
de = detail.groupby(by='amounts')['counts'].mean()
print(de)

###按照order_id 与 dishes_id 进行分组,统计amounts的均值
de = detail.groupby(by=['order_id','dishes_id'])['amounts'].mean()
print(de)

###agg方法----可以对多列数据同时进行多个统计分析
de = detail[['counts','amounts']].agg([np.sum,np.mean])
print(de)

#### agg方法----对不同数据求取 不同的统计分析
de = detail.agg({'counts':np.max,'amounts':np.mean})
print(de)

#### agg方法----可以对不同的列进行不同的统计分析
de = detail.agg({'counts':np.max,'amounts':[np.min,np.mean]})
print(de)

### apply  自定义自己的统计方法
print(detail['amounts'])

de = detail['amounts'].apply(lambda x:x+1)
print(de)

de = detail[['counts','amounts']].transform(lambda x:x+1 )
print(de)

猜你喜欢

转载自blog.csdn.net/weixin_43567965/article/details/92842962