一、使用分组聚合进行组内计算

使用groupby方法拆分数据

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

DataFrame.groupby(by=None, axis=0, level=None, as_index=True,

sort=True, group_keys=True, squeeze=False, **kwargs)




java list lamada分组求和_linq 分组拼接字符串不支持


by参数的特别说明

o 字符串或者字符串列表:使用这些字符串所代表的字段作为分组依据

o 函数:使用函数对索引进行计算并分组

o 字典或者Series:使用字典或者Series的值用做分组依据

o NumPy数组:使用数组的元素作为分组依据

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

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

· 分组后的数据对象GroupBy类似Series与DataFrame


java list lamada分组求和_字段_02


使用agg方法聚合数据

· agg,aggregate函数都支持对每个分组应用某函数(包括Python内置函数或自定义函数)

· agg,aggregate函数都支持直接对DataFrame进行函数应用操作。

· 一般情况下,agg和aggregate函数对DataFrame对象操作时功能几乎完全相同,

DataFrame.agg(func, axis=0, *args, **kwargs)

DataFrame.aggregate(func, axis=0, *args, **kwargs)


java list lamada分组求和_字段_03


使用agg方法聚合数据:求统计量

· 可以使用agg方法一次求出当前数据中所有菜品销量和售价的总和与均值detail[['counts','amounts']].agg([np.sum,np.mean]))

· 对于某个字段希望只做求均值操作,而对另一个字段则希望只做求和操作,

o 可以使用字典的方式,将两个字段名分别作为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方法可传入自定义的函数

o 在agg中可直接使用NumPy库中的函数,如np.mean,np.median,np.sum等

o 但在自定义函数中使用NumPy库中的这些函数,如果计算的时候是单个序列则会无法得出想要的结果,如果是多列数据同时计算则不会出现这种问题。

· 使用agg方法能够实现对每一个字段每一组使用相同的函数

· 如需对不同的字段应用不同函数,则可和Dataframe中使用agg方法相同

使用apply方法聚合数据

· apply方法类似agg方法

· apply与agg比较

o apply传入的函数只能够作用于整个DataFrame或Series

o apply没有agg对不同字段,应用不同函数获取不同结果的功能

o apply方法对GroupBy对象进行聚合操作的方法和agg方法类似

DataFrame.apply(func, axis=0, broadcast=False,

raw=False, reduce=None, args=(), **kwds)


java list lamada分组求和_java8 多个字段分组_04


使用transform方法聚合数据

· transform方法能够对整个DataFrame的所有元素进行操作。且transform方法只有一个参数“func”,表示对DataFrame操作的函数。

· 同时transform方法还能够对DataFrame分组后的对象GroupBy进行操作,可以实现组内离差标准化等操作。

· 若在计算离差标准化的时候结果中有NaN,这是由于根据离差标准化公式,最大值和最小值相同的情况下分母是0。而分母为0的数在Python中表示为NaN

创建透视表和交叉表

使用povit_table函数创建透视表

· 利用pivot_table函数可以实现透视表,pivot_table()函数的常用参数及其使用格式如下。


java list lamada分组求和_聚合数据_05


· 在不特殊指定聚合函数aggfunc时,会默认使用numpy.mean进行聚合运算,numpy.mean会自动过滤掉非数值类型数据。可以通过指定aggfunc参数修改聚合函数。

· 和groupby方法分组的时候相同,pivot_table函数在创建透视表的时候分组键index可以有多个。

· 通过设置columns参数可以指定列分组。

· 当全部数据列数很多时,若只想要显示某列,可以通过指定values参数来实现。

· 当某些数据不存在时,会自动填充NaN,因此可以指定fill_value参数,表示当存在缺失值时,以指定数值进行填充。

· 可以更改margins参数,查看汇总数据。

使用crosstab函数创建交叉表

· 交叉表是一种特殊的透视表,主要用于计算分组频率。利用pandas提供的crosstab函数可以制作交叉表,crosstab函数的常用参数和使用格式如下。

· 由于交叉表是透视表的一种,其参数基本保持一致,不同之处在于crosstab函数中的index,columns,values填入的都是对应的从Dataframe中取出的某一列。

pandas.crosstab(index, columns, values=None, rownames=None, colnames=None,

aggfunc=None, margins=False, dropna=True, normalize=False)


java list lamada分组求和_linq 分组拼接字符串不支持_06


实例

以餐饮数据为例

· 介绍了数据库数据,csv数据,Excel数据三种常用的数据读取与写入方式

· 阐述了DataFrame的常用属性,方法与描述性统计相关内容。

· 介绍了时间数据的转换,信息提取与算术运算

· 剖析了分组聚合方法groupby的原理,用法和三种聚合方法

· 展现了透视表与交叉表的制作方法

二、Pandas数据预处理

合并数据

堆叠合并数据:横向堆叠

· 横向堆叠,即将两个表在1轴方向不同的列拼接在一起

· concat函数可以完成横向堆叠,concat函数的基本语法如下。

pandas.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,

keys=None, levels=None, names=None, verify_integrity=False, copy=True)

java list lamada分组求和_数据_07

java list lamada分组求和_linq 分组拼接字符串不支持_08


· 当axis=1的时候,concat做行对齐,然后将不同列名称的两张或多张表合并

· 当两个表索引不完全一样时,可以使用join参数选择是内连接还是外连接

o 在内连接的情况下,仅仅返回索引重叠部分

o 在外连接的情况下,则显示索引的并集部分数据,不足的地方则使用空值填补。

· 当两张表完全一样时,结果都是将两个表完全按照X轴拼接起来,与join参数无关


java list lamada分组求和_字段_09


堆叠合并数据:纵向堆叠

· 纵向堆叠

o 即将两个表在0轴方向不同的行拼接在一起

· concat函数:

o 在默认情况下,即axis=0时,concat做列对齐,

o 列名并不完全相同的情况下,可使用join参数

o join为inner时,列名取交集,为outer时,列名取并集

o 如果列名相同,则join参数无效


java list lamada分组求和_字段_10


· append方法

o 实现纵向表堆叠前提条件:两张表的列名需要完全一致

· append方法的基本语法

pandas.DataFrame.append(self, other, ignore_index=False, verify_integrity=False)


java list lamada分组求和_字段_11