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
2
3
4
5
6
7
8
9
10
import pandas as pd
# 这里有一张轨迹信息表,很多列citycode等都是字段,我想按照城市统计轨迹的条数和唯一用户数...
df = pd.read_csv(...)
def f_unique(xlist):
return len(np.unique(xlist))
result = pd.pivot_table(df,index=['citycode', 'cityname'],
values=['track_id', 'user_id'],
aggfunc={'tid':[np.mean,f_unique],'user_id':f_unique},
fill_value=0,margins=False)
result = result.reset_index()
  • 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
2
3
4
5
6
print(reslut.columns)
# 具体列如何视情况分析
cols_dict = dict(reslut.columns)
cols2 = list(cols_dict.keys())
# 替换新列
reslut.columns = cols2

常用函数列举

前面已经分析过,实际上函数计算的对象是针对最小拆分单元(扁平一维序列series),那么就可以将其视为一个list进行任意个性化的统计。np自带的函数有

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
np.unique()查找数组的唯一元素
np.isin()返回一个布尔数组,如果的元素在指定list中,则返回 True,否则返回 False
np.count_nonzero计算非0值的个数

argmax()返回沿轴的最大值的索引。
nanargmax()返回指定轴中最大值的索引,忽略 NaN。
argmin()返回沿轴的最小值的索引。
nanargmin()返回指定轴中最小值的索引,忽略 NaN。

ptp()沿轴的值范围(最大值 - 最小值),极差。
median()计算沿指定轴的中位数。
average()计算沿指定轴的加权平均值。
mean()计算沿指定轴的算术平均值。
std()计算沿指定轴的标准偏差。
var()计算沿指定轴的方差。
nanmedian()计算沿指定轴的中位数,同时忽略 NaN。
nanmean()计算沿指定轴的算术平均值,忽略 NaN。
nanstd()计算沿指定轴的标准偏差,同时忽略 NaN。
nanvar()计算沿指定轴的方差,同时忽略 NaN。

percentile()沿指定轴计算数据的第 q 个百分位数。
nanpercentile()计算沿指定轴的数据的第 q 个百分位数,同时忽略 nan 值。
quantile()沿指定轴计算数据的第 q 个分位数。
nanquantile()沿指定轴计算数据的第 q 个分位数,同时忽略 nan 值。

函数的具体用法可以在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

其他的更加复杂的,多条件的统计或计算则可以通过==自定义函数==完成