pandas.crosstab#

pandas.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, margins_name='All', dropna=True, normalize=False)[源代码][源代码]#

计算两个(或更多)因素的简单交叉表。

默认情况下,计算因子的频率表,除非传递了一个值数组和一个聚合函数。

参数:
索引类数组, 序列, 或数组/序列列表

在行中分组的值。

类数组, 序列, 或数组/序列列表

在列中分组的值。

类数组, 可选

根据因子聚合的值数组。需要指定 aggfunc

rownamessequence, 默认 None

如果传递了,必须匹配传递的行数组的数量。

colnamessequence, 默认 None

如果传递了,必须匹配传递的列数组的数量。

aggfunc函数, 可选

如果指定,则需要 values 也一并指定。

边距布尔值, 默认为 False

添加行/列边距(小计)。

margins_namestr, 默认 ‘所有’

当 margins 为 True 时,包含总计的行/列的名称。

dropnabool, 默认为 True

不要包含所有条目都是 NaN 的列。

normalizebool, {‘all’, ‘index’, ‘columns’}, 或 {0,1}, 默认 False

通过将所有值除以值的总和来进行归一化。

  • 如果传递 ‘all’ 或 True,将对所有值进行归一化。

  • 如果传递 ‘index’ 将按行归一化。

  • 如果传递 ‘columns’,将对每一列进行归一化。

  • 如果 margins 是 True,还将规范化边距值。

返回:
DataFrame

数据的交叉表。

参见

DataFrame.pivot

基于列值重塑数据。

pivot_table

创建一个数据透视表作为 DataFrame。

备注

传递的任何 Series 将使用它们的 name 属性,除非指定了交叉表的行或列名称。

任何包含分类数据输入的交叉表将**全部**包含其所有类别,即使实际数据中不包含某个特定类别的实例。

如果没有重叠的索引,将返回一个空的 DataFrame。

参考 用户指南 获取更多示例。

示例

>>> a = np.array(
...     [
...         "foo",
...         "foo",
...         "foo",
...         "foo",
...         "bar",
...         "bar",
...         "bar",
...         "bar",
...         "foo",
...         "foo",
...         "foo",
...     ],
...     dtype=object,
... )
>>> b = np.array(
...     [
...         "one",
...         "one",
...         "one",
...         "two",
...         "one",
...         "one",
...         "one",
...         "two",
...         "two",
...         "two",
...         "one",
...     ],
...     dtype=object,
... )
>>> c = np.array(
...     [
...         "dull",
...         "dull",
...         "shiny",
...         "dull",
...         "dull",
...         "shiny",
...         "shiny",
...         "dull",
...         "shiny",
...         "shiny",
...         "shiny",
...     ],
...     dtype=object,
... )
>>> pd.crosstab(a, [b, c], rownames=["a"], colnames=["b", "c"])
b   one        two
c   dull shiny dull shiny
a
bar    1     2    1     0
foo    2     2    1     2

这里 ‘c’ 和 ‘f’ 在数据中没有表示,并且不会在输出中显示,因为 dropna 默认是 True。设置 dropna=False 以保留没有数据的分组。

>>> foo = pd.Categorical(["a", "b"], categories=["a", "b", "c"])
>>> bar = pd.Categorical(["d", "e"], categories=["d", "e", "f"])
>>> pd.crosstab(foo, bar)
col_0  d  e
row_0
a      1  0
b      0  1
>>> pd.crosstab(foo, bar, dropna=False)
col_0  d  e  f
row_0
a      1  0  0
b      0  1  0
c      0  0  0