Pandas(3):pivot_table数据透视表分类汇总统计用法速记
groupby常用于简单的汇总统计,多个变量及复杂统计可使用数据透视==pd.pivot_table==。其在excel中数据透视表也是一个很好用的工具,用法也很简单。此处详细列一下常用写法以及函数(如统计某列的唯一值数量),如果只是想变换表格的形状和行列,使用==pd.pivot()==。
pivot用法reshape
pd.pivot(index="date", columns="variable", values="value")举例,我这里有一张表是这样的,96个格网的1998年到2017年的气温降水数据,四列,共96*20=1960行:
- 现在我想改成96行,每列是一个气温指标,如下。(如果不指定values则会同时有两张表)
1 | df.pivot(index="ORIG_FID", columns="year", values="tem") |
pivot_table参数详解
该方法用于对数据按照指定类别字段进行--分类汇总/统计,以下为我对该方法的使用理解,不熟悉可先在excel中使用该功能。
pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False, sort=True),这里的参数基本都常用,举例:
1 | import pandas as pd |
data,fill_value,dropna望文生义即可,margins即是否求一个行列的总和。
index:用来分组汇总的要素,比如我这里按城市分组,这里的分组就是拆分再组合,即按照城市拆开分别用同样的方法运算,再组合成一张表。
values:需要计算统计的指标列名,比如这里是我想统计轨迹和用户数量,则取轨迹的id和用户id。
columns:这里是另一个维度的分组变量,是对指标的数值进行分组,比如我这里还有一列用来指示轨迹的年份,那么就会按年,在index分组切分之后的基础上再分组用于计算。通常用于类别变量,比如指标值有a b c 三种数值,需要分别统计。
- observed与columns组合使用,即可以对指标的数值类进行进一步的筛选
aggfunc:统计的方式,默认为求均值。这里实际上是对每一个最小拆分后的组分进行计算,再连接到index及columns。即函数的输入可以视为df的某列的一些元素,一维序列series!比如这里每次计算的是面向一个城市的track_id组成的列表,理解了这个就方便我们写自定义函数了
- 每个指标都可以应用多个函数,通过列表指定即可,如[np.sum, np.mean,...]
- 也可以使用pandas series支持的函数unique();nunque(),如
f_unique = lambda x: len(x.unique())
其中,如果不按上述方式用字典指定values对应的函数则会每个指标都应用函数,如
aggfunc = [np.sum, np.mean]
则会计算track_id和user_id两列的求和及均值,得到四列
结果表
得到的结果通常具有多维索引,且列名不符合预期,此时可以进行如下调整:
1 | reslut = reslut.reset_index() |
如果列是多重索引,可以先转成字典再计算值得到目标列名再替换
1 | print(reslut.columns) |
常用函数列举
前面已经分析过,实际上函数计算的对象是针对最小拆分单元(扁平一维序列series),那么就可以将其视为一个list进行任意个性化的统计。np自带的函数有
1 | np.unique()查找数组的唯一元素 |
函数的具体用法可以在numpy文档搜素:
https://numpy.org/doc/stable/reference/routines.set.html
https://numpy.org/doc/stable/reference/routines.sort.html
https://numpy.org/doc/stable/reference/routines.statistics.html
其他的更加复杂的,多条件的统计或计算则可以通过==自定义函数==完成