import pandas as pd
df = pd.DataFrame({
'channel': ['seo','ads','seo','seo','ads'],
'device': ['mobile','desktop','desktop','mobile','mobile']
})
pd.crosstab(df['channel'], df['device'])
Результат:
device desktop mobile channel ads 1 1 seo 1 2
pd.crosstab(df['channel'], df['device'],
margins=True, normalize=True)
Результат:
device desktop mobile All channel ads 0.2 0.2 0.4 seo 0.2 0.4 0.6 All 0.4 0.6 1.0
df2 = pd.DataFrame({
'channel': ['seo','ads','seo','ads'],
'device': ['mobile','mobile','desktop','desktop'],
'amount': [100, 250, 140, 300]
})
pd.crosstab(df2['channel'], df2['device'],
values=df2['amount'], aggfunc='sum')
Результат:
device desktop mobile channel ads 300 250 seo 140 100Порешать Python-задачи в тренажёре →
Просят на собесе для быстрой таблицы сопряжённости двух признаков (частоты, доли), рядом с вопросами про pivot_table и groupby.
crosstab по умолчанию считает частоты (count) и принимает на вход сами Series или массивы, а не имена колонок. pivot_table работает с колонками DataFrame и по умолчанию усредняет. По сути crosstab — это специализированная обёртка над pivot_table для таблиц сопряжённости.
Параметр normalize: True — доля от общей суммы, 'index' — по строкам, 'columns' — по столбцам. Вместе с margins=True добавится строка и столбец 'All' с итогами, что удобно для быстрой проверки распределения.
Да, передайте values= и aggfunc=, например values=df['amount'], aggfunc='sum'. Тогда crosstab превращается в обычную сводную с агрегацией по указанной функции вместо простого подсчёта строк.
Pandas groupby · Pandas: основы
groupby · merge · pivot_table · apply · value_counts · drop_duplicates
Открыть Python-тренажёр (556 задач) →