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