4. 透视表和交叉表

  1. 透视表pivot table是一种数据汇总工具。它根据一个或者多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个单元格中。

    • 你可以通过.groupby功能以及索引的变换来手工实现这种功能
  2. DataFrame.pivot_table()方法,以及pandas.pivot_table()函数都可以实现这种功能

    1. pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean',
    2. fill_value=None, margins=False, dropna=True, margins_name='All')
    • data:一个DataFrame对象
    • values:指定哪些列将被聚合。默认聚合所有的数值列。
    • index:一个index label、一个Grouper、一个数组,或者前面这些类型的一个列表。它指定关于分组的列名或者其他分组键,出现在结果透视表的行
    • columns:一个column label、一个Grouper、一个数组,或者前面这些类型的一个列表。它指定关于分组的列名或者其他分组键,出现在结果透视表的列
    • aggfunc:一个函数或者函数的列表。默认为numpy.mean。它作为聚合函数。如果为函数的列表,则结果中会出现多级索引,函数名就是最外层的索引名。
    • fill_value:一个标量,用于替换NaN
    • margins:一个布尔值。如果为True,则添加行/列的总计。
    • dropna:一个布尔值。如果为True,则结果不包含这样的列:该列所有元素都是NaN
    • margins_name:一个字符串。当margins=True时,margin列的列名。

    pivot_table0 pivot_table1 pivot_table2

  3. 交叉表cross-tabulation:crosstab是一种用于计算分组频率的特殊透视表。我们可以使用pivot_table()函数实现透视表的功能,但是直接使用更方便:

    1. pandas.crosstab(index, columns, values=None, rownames=None, colnames=None,
    2. aggfunc=None, margins=False, dropna=True, normalize=False)
    • index:一个array-likeSeries或者前两种的列表。它给出了行的计算频数的数据。

    • columns:一个array-likeSeries或者前两种的列表。它给出了列的计算频数的数据。

    • values:一个array-like,该数据用于聚合。如果出现了values,则必须提供aggfunc

    • aggfunc:一个函数对象,是聚合函数。如果出现了aggfunc,则必须提供values

    • rownames:一个序列。如果非空,则必须和结果的row indexlevel数量相等

    • colnames:一个序列。如果非空,则必须和结果的column indexlevel数量相等

    • margins:一个布尔值。如果为True,则添加行/列的总计。

    • dropna:一个布尔值。如果为True,则结果不包含这样的列:该列所有元素都是NaN

    • normalize:一个布尔值、字符串('all'/'index'/'columns')、或者整数0/1。它指定是否进行归一化处理(归一化为频率),否则就是频数。

      • 如果'all'/True,则对所有数据进行归一化
      • 如果为'index':则对每一行归一化
      • 如果为'columns':则对每一列归一化
      • 如果marginsTrue,则对margins也归一化。

    values的作用是这样的:首先根据index-columns建立坐标。行坐标来自index,列坐标来自columns。在index-columns-values中,同一个坐标下的values组成Series。这个Seriesaggfunc进行聚合,aggfunc接受一个Series,返回一个标量。此时就不再是对坐标点进行计数了,而是对values进行聚合。

    crosstab0 crosstab1 crosstab2