Сообщить об ошибке.

Функция crosstab() модуля pandas в Python

Перекрестная таблица для двух или более факторов

Синтаксис:

import pandas

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

Параметры:

  • index - значения для группировки по строкам. Может быть массивом, Series или списком этих типов.
  • columns - значения для группировки по столбцам. Может быть массивом/списком, Series или списком этих типов.
  • values=None - массив/список значений для агрегирования в соответствии с факторами. Требуется указать аргумент aggfunc.
  • rownames=None - должно соответствовать количеству переданных строк index.
  • colnames=None - должно соответствовать количеству переданных столбцов columns.
  • aggfunc=None - функция агрегации, будет применена к значениям аргумента values в каждой группе, определенной в index и columns.
  • margins=False - добавляет поля строк/столбцов (промежуточные итоги).
  • margins_name='All' - имя строки/столбца, которая будет содержать промежуточные итоги, если margins=True.
  • dropna=True - исключает столбцы, все записи которых имеют значение NaN.
  • normalize=False - нормализует, разделяя все значения на сумму значений.

    • Если передано значение 'all' или True, то будет нормализовано для всех значений.
    • Если передано значение 'index' будет нормализовано для каждой строки.
    • Если передано значение 'columns' будет нормализовано для каждого столбца.
    • Если margins ='True', также будут нормализованы значения полейmargins_name`.

Возвращаемое значение:

  • DataFrame как перекрестная таблица данных.

Описание функции pandas.crosstab

Функция crosstab() модуля pandas вычисляет простую перекрестную таблицу для двух (или более) факторов.

По умолчанию вычисляется таблица частот факторов, если не задан массив значений и функция агрегирования. В том случае, если индексы не перекрываются, будет возвращен пустой DataFrame.

Для любой передаваемой Series будут использоваться атрибуты Series.name, если для перекрестной таблицы не указаны имена строк rownames или столбцов colnames.

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

Если функция pandas.crosstab() получает только две серии, то она предоставит таблицу частот.

df = pd.DataFrame(
    {"A": [1, 2, 2, 2, 2], "B": [3, 3, 4, 4, 4], "C": [1, 1, np.nan, 1, 1]}
)

>>> df
#    A  B    C
# 0  1  3  1.0
# 1  2  3  1.0
# 2  2  4  NaN
# 3  2  4  1.0
# 4  2  4  1.0

# передаем 2 серии
>>> pd.crosstab(df["A"], df["B"])
# B  3  4
# A      
# 1  1  0
# 2  1  3

Любые переданные входные данные, содержащие категориальные данные, будут включать все свои категории в перекрестную таблицу, даже если фактические данные не содержат никаких экземпляров определенной категории.

Функция pandas.crosstab() также может суммироваться по категориальным данным.

>>> foo = pd.Categorical(['a', 'b'], categories=['a', 'b', 'c'])
>>> bar = pd.Categorical(['d', 'e'], categories=['d', 'e', 'f'])
>>> foo
# ['a', 'b']
# Categories (3, object): ['a', 'b', 'c']

>>> bar
# ['d', 'e']
# Categories (3, object): ['d', 'e', 'f']

>>> pd.crosstab(foo, bar)
# col_0  d  e
# row_0
# a      1  0
# b      0  1

В примере выше, столбцы 'c' и 'f' не представлены в данных и не будут показаны в выходных данных, т.к. значение аргумента dropna по умолчанию равно True. Чтобы сохранить категории без данных необходимо установить аргумент dropna=False.

# установим аргумент `dropna=False`
>>> 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

Нормализация результатов:

Таблицы частот также можно нормализовать, чтобы они отображали проценты, а не количество. Для этого используя аргумент normalize:

>>> df
#    A  B    C
# 0  1  3  1.0
# 1  2  3  1.0
# 2  2  4  NaN
# 3  2  4  1.0
# 4  2  4  1.0

>>> pd.crosstab(df["A"], df["B"], normalize=True)
# B    3    4
# A          
# 1  0.2  0.0
# 2  0.2  0.6

Нормализовать результаты можно в каждой строке или в каждом столбце:

>>> pd.crosstab(df["A"], df["B"], normalize="columns")
# B    3    4
# A          
# 1  0.5  0.0
# 2  0.5  1.0

Функция pandas.crosstab() может третью Series и функцию агрегации (аргумент aggfunc), которая будет применена к значениям третьей серии в каждой группе, определенной первыми двумя сериями:

>>> pd.crosstab(df["A"], df["B"], values=df["C"], aggfunc="sum")
# B    3    4
# A          
# 1  1.0  NaN
# 2  1.0  2.0

Поведение аргумента margins:

Аргумент margins=True добавит строку и столбец с меткой 'All' с частичным групповым агрегированием по категориям в строках и столбцах:

pd.crosstab(
    df["A"], df["B"], values=df["C"], aggfunc="sum", normalize=True, margins=True
)

# B       3    4   All
# A                   
# 1    0.25  0.0  0.25
# 2    0.25  0.5  0.75
# All  0.50  0.5  1.00