pandas.crosstab#

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

计算两个(或更多)因素的简单交叉表。默认情况下,除非传递了值数组和聚合函数,否则会计算因子的频率表。

参数
index类似阵列、系列或阵列/系列列表

行中分组依据的值。

columns类似阵列、系列或阵列/系列列表

列中分组依据的值。

values类似阵列,可选

要根据系数聚合的值数组。要求 aggfunc 被指定。

rownames序列,默认为无

如果传递,则必须与传递的行数组数目匹配。

colnames序列,默认为无

如果传递,则必须与传递的列数组数目匹配。

aggfunc函数,可选

如果指定,则需要 values 也是指定的。

margins布尔值,默认为False

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

margins_name字符串,默认为‘All’

当边距为True时将包含总计的行/列的名称。

dropna布尔值,默认为True

不包括条目全部为NaN的列。

normalizeBool,{‘All’,‘index’,‘Columns’}或{0,1},默认为FALSE

通过将所有值除以值的和来进行规格化。

  • 如果传递的是“all”或 True ,将对所有值进行正常化。

  • 如果传递,‘index’将在每一行上正常化。

  • 如果传递,‘Columns’将在每一列上正常化。

  • 如果边距为 True ,还将使保证金值正常化。

退货
DataFrame

数据的交叉表。

参见

DataFrame.pivot

根据列值重塑数据。

pivot_table

将数据透视表创建为DataFrame。

注意事项

除非指定了交叉表的行名或列名,否则传递的任何系列都将使用其名称属性。

传递的任何包含分类数据的输入都将具有 all 即使实际数据不包含某一特定类别的任何实例,也应包括在交叉表中所包括的类别。

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

参考文献 the user guide 查看更多示例。

示例

>>> 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