# pandas.crosstab

`pandas.``crosstab`(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, margins_name='All', dropna=True, normalize=False)

  Compute a simple cross tabulation of two (or more) factors. By default computes a frequency table of the factors unless an array of values and an aggregation function are passed.

  Parameters:

  index : array-like, Series, or list of arrays/Series

  > Values to group by in the rows.

  columns : array-like, Series, or list of arrays/Series

  > Values to group by in the columns.

  values : array-like, optional

  > Array of values to aggregate according to the factors. Requires aggfunc be specified.

  rownames : sequence, default None

  > If passed, must match number of row arrays passed.

  colnames : sequence, default None

  > If passed, must match number of column arrays passed.

  aggfunc : function, optional

  > If specified, requires values be specified as well.

  margins : bool, default False

  > Add row/column margins (subtotals).

  margins_name : str, default ‘All’

  > Name of the row/column that will contain the totals when margins is True.

  > New in version 0.21.0.

  dropna : bool, default True

  > Do not include columns whose entries are all NaN.

  normalize : bool, {‘all’, ‘index’, ‘columns’}, or {0,1}, default False

  > Normalize by dividing all values by the sum of values.

  > - If passed ‘all’ or True, will normalize over all values.
  > - If passed ‘index’ will normalize over each row.
  > - If passed ‘columns’ will normalize over each column.
  > - If margins is True, will also normalize margin values.

  > New in version 0.18.1.

  Returns:

  DataFrame

  > Cross tabulation of the data.

  See also

  `DataFrame.pivot`
    Reshape data based on column values.
  `pivot_table`
    Create a pivot table as a DataFrame.

  Notes

  Any Series passed will have their name attributes used unless row or column names for the cross-tabulation are specified.

  Any input passed containing Categorical data will have all of its categories included in the cross-tabulation, even if the actual data does not contain any instances of a particular category.

  In the event that there aren’t overlapping indexes an empty DataFrame will be returned.

  Examples

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

  Here ‘c’ and ‘f’ are not represented in the data and will not be shown in the output because dropna is True by default. Set dropna=False to preserve categories with no data.

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

Scroll To Top