Функция crosstab
Функция crosstab принимает одномерные массивы, серии или списки
и строит по ним таблицу сопряжённости. Первым параметром обычно
передаются значения для строк, вторым - для столбцов.
Результатом является DataFrame с частотами комбинаций.
Функция также позволяет добавлять агрегирующие функции через параметр
aggfunc и заполнять пропуски через параметр fill_value.
Синтаксис
pd.crosstab(index, columns, values=None, rownames=None,
colnames=None, aggfunc=None, margins=False,
margins_name='All', dropna=True, normalize=False)
Пример
Построим простую таблицу частот по двум категориальным признакам:
import pandas as pd
df = pd.DataFrame({
'a': ['X', 'X', 'Y', 'Y', 'X'],
'b': ['A', 'B', 'A', 'A', 'B']
})
res = pd.crosstab(df['a'], df['b'])
print(res)
Результат выполнения кода:
b A B
a
X 1 2
Y 2 0
Пример
Добавим строку и столбец с итоговыми суммами с помощью параметра margins:
import pandas as pd
df = pd.DataFrame({
'a': ['X', 'X', 'Y', 'Y', 'X'],
'b': ['A', 'B', 'A', 'A', 'B']
})
res = pd.crosstab(df['a'], df['b'], margins=True)
print(res)
Результат выполнения кода:
b A B All
a
X 1 2 3
Y 2 0 2
All 3 2 5
Пример
Вместо подсчёта частот выполним агрегацию значений с помощью параметра aggfunc.
Для этого передадим в параметр values столбец с числами:
import pandas as pd
df = pd.DataFrame({
'a': ['X', 'X', 'Y', 'Y', 'X'],
'b': ['A', 'B', 'A', 'A', 'B'],
'c': [10, 20, 30, 40, 50]
})
res = pd.crosstab(df['a'], df['b'],
values=df['c'], aggfunc='sum')
print(res)
Результат выполнения кода:
b A B
a
X 10.0 70.0
Y 70.0 NaN
Пример
Используем параметр normalize для вычисления относительных частот:
import pandas as pd
df = pd.DataFrame({
'a': ['X', 'X', 'Y', 'Y', 'X'],
'b': ['A', 'B', 'A', 'A', 'B']
})
res = pd.crosstab(df['a'], df['b'], normalize='index')
print(res)
Результат выполнения кода:
b A B
a
X 0.333333 0.666667
Y 1.000000 0.000000
Пример
Работа с несколькими категориальными столбцами для создания многомерной таблицы:
import pandas as pd
df = pd.DataFrame({
'a': ['X', 'X', 'Y', 'Y', 'X'],
'b': ['A', 'B', 'A', 'A', 'B'],
'c': ['P', 'Q', 'P', 'Q', 'P']
})
res = pd.crosstab([df['a'], df['c']], df['b'])
print(res)
Результат выполнения кода:
b A B
a c
X P 1 1
Q 0 1
Y P 1 0
Q 1 0
Смотрите также
-
функция
pivot_table,
которая строит сводную таблицу с агрегацией -
функция
pivot,
которая перестраивает таблицу без агрегации -
функция
melt,
которая выполняет обратное преобразование сводных таблиц -
функция
cut,
которая разбивает числовые данные на интервалы