4. 透视表和交叉表
透视表
pivot table
是一种数据汇总工具。它根据一个或者多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个单元格中。- 你可以通过
.groupby
功能以及索引的变换来手工实现这种功能
- 你可以通过
DataFrame.pivot_table()
方法,以及pandas.pivot_table()
函数都可以实现这种功能pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean',
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
列的列名。
交叉表
cross-tabulation:crosstab
是一种用于计算分组频率的特殊透视表。我们可以使用pivot_table()
函数实现透视表的功能,但是直接使用更方便:pandas.crosstab(index, columns, values=None, rownames=None, colnames=None,
aggfunc=None, margins=False, dropna=True, normalize=False)
index
:一个array-like
、Series
或者前两种的列表。它给出了行的计算频数的数据。columns
:一个array-like
、Series
或者前两种的列表。它给出了列的计算频数的数据。values
:一个array-like
,该数据用于聚合。如果出现了values
,则必须提供aggfunc
。aggfunc
:一个函数对象,是聚合函数。如果出现了aggfunc
,则必须提供values
。rownames
:一个序列。如果非空,则必须和结果的row index
的level
数量相等colnames
:一个序列。如果非空,则必须和结果的column index
的level
数量相等margins
:一个布尔值。如果为True
,则添加行/列的总计。dropna
:一个布尔值。如果为True
,则结果不包含这样的列:该列所有元素都是NaN
normalize
:一个布尔值、字符串('all'/'index'/'columns'
)、或者整数0/1
。它指定是否进行归一化处理(归一化为频率),否则就是频数。- 如果
'all'/True
,则对所有数据进行归一化 - 如果为
'index'
:则对每一行归一化 - 如果为
'columns'
:则对每一列归一化 - 如果
margins
为True
,则对margins
也归一化。
- 如果
values
的作用是这样的:首先根据index-columns
建立坐标。行坐标来自index
,列坐标来自columns
。在index-columns-values
中,同一个坐标下的values
组成Series
。这个Series
被aggfunc
进行聚合,aggfunc
接受一个Series
,返回一个标量。此时就不再是对坐标点进行计数了,而是对values
进行聚合。