数据汇总是指基于已有的明细数据做进一步的统计计算,这是数据分析过程中必备的基础知识,也是学习或工作中经常使用到的知识点,类似于Excel中透视表说完成的数据汇总以及数据库中实现的分组聚合。
Pandas模块既提供了Excel透视表的功能,也提供了数据库中的分组聚合功能。
一、透视表功能
该功能的主要目的就是实现数据的汇总统计,例如按照某个分组变量统计商品的平均价格、销售数量、最大利润等,或者按照某两个分组变量构成统计学中的列联表(计数统计),甚至基于多个分组变量统计各组合下的均值、中位数、总和等。
Pandas模块中的pivot_table函数就是实现透视表功能的强大函数,该函数简单易用,与Excel操作思想完全一致。
pd.pivot_table(data,values=None,index=None,columns=None,aggfunc='mean',fill_value=None,margins=False,dropna=True,margins_name='All')
pivot_table函数的参数说明如下:
data:指定需要构造透视表的数据集values:指定需要拉入“数值”框的变量列表index:指定需要拉入“行标签”框的变量列表columns:指定需要拉入“列标签”框的变量列表aggfunc:指定数组的统计函数,默认为统计均值,也可以指定numpy模块中的其他统计函数(numpy是Python中一个专门用于角数值运算的模块)fill_value:指定一个标量,用于填充缺失值margins:bool类型参数,是否需要显示行或列的总计值,默认为Falsedropna:bool类型参数,是否需要删除整列为缺失的变量,默认为Falsemargins_name:指定行或列的踪迹名称,默认为All
以下列数据来看看单个分组变量的均值统计:
import pandas as pd path = r'C:\Users\lin-a\Desktop\【数据分析从入门到进阶】配套数据\第5章\datas\diamonds.csv'diamonds = pd.read_table(path,sep=',')diamonds
53940 rows × 10 columns
# 数据透视,均值pd.pivot_table(diamonds,index='color',values='price',margins=True,margins_name='总计')
结果显示,基于变量color的汇总统计(price的均值),返回结果属于Pandas模块的序列类型,该结果与Excel形成的数据透视表完全一致。
import numpy as np# 两个变量的结果pd.pivot_table(data=diamonds,index='clarity',columns='cut',values='carat',aggfunc=np.size,margins=True,margins_name='总计')
对于列联表来说,行和列都需要指定某个分组变量,所以index参数和columns参数都需要指定一个分组变量,并且统计的不再是某个变量的均值,而是观测个数,所以aggfunc参数需要指定numpy模块的size行数。通过这样的参数设置,返回的是一个数据框对象,结果也是与Excel透视表完全一样。
二、分组聚合操作
在Pandas中,只需结合groupby()方法和aggregate()方法,就可以完美地得到统计结果。
import pandas as pdimport numpy as nppath = r'C:\Users\lin-a\Desktop\【数据分析从入门到进阶】配套数据\第5章\datas\diamonds.csv'diamonds = pd.read_table(path,sep=',')diamonds.head()
# 通过groupby方法,指定分组变量groups = diamonds.groupby(['color','cut'])# 对分组变量进行统计汇总result = groups.agg({'color':np.size,'carat':np.min,'price':np.mean,'face_width':np.max})result
使用Pandas实现分组聚合,需要分两步走:
指定分组变量,可以通过groupby方法完成;对不同数值变量计算各自的统计值,在这一步,必须以字典的形式控制变量名称和统计函数。
我们发现变量color和cut变成了数据框的索引,如果需要将这两个行索引转换为数据框的变量名,可以使用reset_index()方法
# 重命名变量名称result.rename(columns={'color':'counts','carat':'min_weight','price':'avg_price','face_width':'max_face_width'},inplace=True)# 将行索引换换位数据库的变量result.reset_index(inplace=True)result
如果觉得《Python数据分析补充:数据的分组与汇总(数据透视)》对你有帮助,请点赞、收藏,并留下你的观点哦!