点击跳转 《Pandas系列目录》
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())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))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