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