ИЗМЕНЕНИЕ ФРАМОВ ДАННЫХ С PANDAS
Встречайте самые сложные функции Pandas, часть II
Узнайте, когда и как crosstab()
Вступление
Я помню, как мне нравился курс под названием «Промежуточная визуализация данных с помощью Seaborn» на DataCamp. Он обучал довольно крутым сюжетам и методам для DV. Когда дело дошло до тепловых карт, инструктор внезапно представил совершенно новую pandas
функцию crosstab()
. Затем быстро сказал: «crosstab()
- полезная функция, которая вычисляет таблицы кросс-табуляции ...»
Я заблудился прямо здесь. Очевидно, моим первым побуждением было проверить документацию по функции. Я только начинал чувствовать, что могу обрабатывать любую документацию после Matplotlib, и ... я ошибался. Даже примеры были приведены на numpy
массивах, а я должен был создавать тепловые карты, используя чертову функцию🤦♂️.
После того, как я попрактиковался в этом, я понял, что другие тоже будут бороться с этим. Итак, здесь я пишу об этом целую статью.
В последней части этой статьи я рассказал о том, почему на некоторых курсах не обучают продвинутым функциям, таким как crosstab()
. Просто сложно создать контекст, в котором будут полезны такие функции, сохранив уровень примеров для новичка. Кроме того, в большинстве курсов используются небольшие или игрушечные наборы данных. Преимущества таких функций более очевидны в более сложных средах обработки данных и часто используются более опытными pandas
пользователями.
В этом посте я научу вас использовать crosstab()
и случаи, когда вы выбираете его по сравнению с другими аналогичными функциями. Наслаждаться!
Интерактивное оглавление (только в Интернете)
∘ Введение
∘ Настройка
∘ Pandas crossstab (), основы
∘ Сравнение Pandas crossstab () с pivot_table () и groupby ()
∘ Pandas crossstab (), настройка еще больше
∘ Pandas crossstab (), множественные группировки
Вы можете скачать блокнот этой статьи на этом репозитории GitHub.
Настраивать
В качестве примера данных я буду использовать набор данных diamonds
, встроенный в Seaborn. Он достаточно большой и содержит переменные, которые можно суммировать с помощью crosstab()
:
С этого момента я сделал гиперссылку на документацию каждой функции при их первом появлении.
Панды crosstab()
, основы
Как и многие функции, вычисляющие сгруппированную сводную статистику, crosstab()
работает с категориальными данными. Его можно использовать для группировки двух или более переменных и выполнения вычислений для заданного значения для каждой группы. Конечно, такие операции возможны с использованием groupby()
или pivot_table()
, но, как мы увидим позже, crosstab()
привносит ряд преимуществ в ваш повседневный рабочий процесс.
Функция crosstab()
принимает два или более списков, pandas
рядов или столбцов фрейма данных и по умолчанию возвращает частоту каждой комбинации. Мне всегда нравится начинать с примера, чтобы вы могли лучше понять определение, а затем я перейду к объяснению синтаксиса.
crosstab()
всегда возвращает фрейм данных, и ниже приведен пример. Фрейм данных представляет собой перекрестную таблицу двух переменных из diamonds
: cut
и color
. Кросс-табуляция означает просто взять одну переменную, отобразив ее группы в виде индексов, и взять другую, отобразив ее группы в виде столбцов.
Синтаксис довольно прост. index
используется для группировки переменных и отображения их в виде индексов (строк) и то же самое для columns
. Если функция агрегирования не указана, каждая ячейка будет вычислять количество наблюдений в каждой комбинации. Например, левая верхняя ячейка сообщает нам о 2834 идеально ограненных алмазах с цветовым кодом D. .
Затем для каждой комбинации мы хотим увидеть их среднюю цену. crosstab()
предоставляет параметр values
для введения третьей числовой переменной для агрегирования:
Теперь каждая ячейка содержит среднюю цену для каждой комбинации огранки и цвета. Чтобы сказать, что мы хотим вычислить среднюю цену, мы передаем столбец price
в values
. Обратите внимание, что вы всегда должны использовать values
и aggfunc
вместе. В противном случае вы получите ошибку. Я также использовал round()
, чтобы округлить ответы.
Несмотря на то, что он немного продвинут, вы сможете полностью использовать преимущества crosstab()
таблиц, когда вы передадите их в seaborn
тепловые карты. Давайте посмотрим на приведенную выше таблицу на тепловой карте:
seaborn
может автоматически преобразовывать crosstab()
таблицы в тепловые карты. Я установил аннотации на True
и отобразил тепловую карту с цветной полосой. seaborn
также добавляет стиль к именам столбцов и индексов (fmt = 'g'
отображает числа как целые, а не в экспоненциальной нотации).
Тепловые карты намного проще интерпретировать. Вы же не хотите, чтобы глаза ваших конечных пользователей кровоточили, глядя на таблицу, полную чисел. Итак, я буду помещать каждый результат crosstab()
в тепловую карту всякий раз, когда мне нужно. Чтобы избежать повторения, я создал полезную функцию:
Сравнение Pandas crossstab () с pivot_table () и groupby ()
Прежде чем мы перейдем к более интересным вещам, я думаю, мне нужно прояснить различия между тремя функциями, которые вычисляют сгруппированную сводную статистику.
О различиях pivot_table()
и groupby()
я рассказывал в первой части статьи. Для crosstab()
разница между ними заключается в синтаксисе и форме результатов. Давайте вычислим последнюю crosstab()
таблицу, используя все три:
Думаю, ты уже знаешь своего любимца. groubpy()
возвращает серию, в то время как два других возвращают в результате идентичные фреймы данных. Однако можно превратить серию groupby
в тот же фрейм данных следующим образом:
Если вы не понимаете синтаксис
pivot_table()
иunstack()
, я настоятельно рекомендую вам прочитать первую часть статьи.
Что касается скорости, crosstab()
быстрее, чем pivot_table()
, но оба они намного медленнее, чем groupby()
:
Как видите, даже при соединении с unstack()
, groupby()
в 3 раза быстрее, чем два других. Это говорит о том, что если вы просто хотите сгруппировать и вычислить сводную статистику, вам следует использовать тот же старый groupby()
. Разница в скорости была еще больше, когда я связал другие методы, например простой round()
.
Остальное сравнение будет касаться в основном pivot_table()
и crosstab()
. Как вы видели, форма результатов двух функций одинакова. Первое различие между ними состоит в том, что crosstab()
может работать с любым типом данных.
Он может принимать любые объекты, подобные массивам, такие как списки, numpy
массивы, столбцы фрейма данных (которые относятся к серии pandas
). Напротив, pivot_table()
работает только с фреймами данных. В полезном потоке StackOverflow я обнаружил, что если вы используете crosstab()
на фрейме данных, он вызывает pivot_table()
под капотом.
Далее идут параметры. Есть параметры, которые существуют только в одном и наоборот. Первый, который является самым популярным, - это crosstab()
's normalize
. normalize
принимает эти параметры (из документации):
- Если передано
all
илиTrue
, нормализуется по всем значениям. - Если передано
index
, нормализуется по каждой строке. - Если передано
columns
, нормализуется по каждому столбцу.
Давайте посмотрим на простой пример:
Если передано all
, для каждой ячейки pandas
вычисляет процент от общей суммы:
Если передано index
или columns
, та же операция выполняется по столбцам или по строкам:
В crosstab()
вы также можете изменять имена индексов и столбцов непосредственно в функции, используя rownames
и colnames
. После этого вам не нужно делать это вручную. Эти два аргумента очень полезны, когда мы группируем по нескольким переменным одновременно, как вы увидите позже.
Параметр fill_value
существует только в pivot_table()
. Иногда, когда вы группируете по многим переменным, неизбежно будет NaN
s. В pivot_table()
вы можете изменить их на пользовательское значение, используя fill_value
:
Но вы можете добиться того же, связав fillna()
в фрейме данных, если вы используете crosstab()
:
Pandas crossstab (), дальнейшая настройка
Два других полезных параметра для crosstab()
- это margins
и margins_name
(оба существуют и в pivot_table()
). Если установлено значение True
, margins
вычисляет промежуточные итоги для каждой строки и столбца. Посмотрим на пример:
pandas
автоматически добавляет последнюю строку и последний столбец с именем по умолчанию All
. margins_name
управляет этим поведением:
Правая нижняя ячейка всегда будет содержать общее количество наблюдений или 1, если, например, для normalize
установлено значение True
:
Обратите внимание, что тепловые карты бесполезны, если вы установите
margins
наTrue
.
Панды crosstab()
, несколько группировок
Для аргументов index
и columns
вы можете передать несколько переменных. Результатом будет фрейм данных с многоуровневыми индексами. Давайте на этот раз подключим все категориальные переменные:
Для индекса я прошел color
и cut
. Если бы я передал их columns
, результатом был бы фрейм данных с 40 столбцами. Если вы обратите внимание, многоуровневые индексы называются cut
и clarity
, как и ожидалось. Для таких ситуаций, когда есть многоуровневые индексы или имена столбцов, crosstab()
имеет удобные параметры для изменения их имени:
Вы передаете список соответствующих имен, чтобы изменить имена индексов на rownames
. То же самое и для colnames
, который управляет именами столбцов.
Одна вещь, которая меня удивила, заключалась в том, что если вы передадите несколько функций в aggfunc
, pandas
выдаст ошибку. Опять же, парни из StackOverflow думают, что это ошибка, и она не решается уже более 6 лет. Если у вас есть какие-то идеи, оставляйте их в комментариях, чтобы мы все могли узнать их ».
В заключение, в pivot_table()
и crosstab()
есть параметр dropna
, который отбрасывает столбцы или строки со всеми NaN
, если он установлен на True
.
Если вам понравилась статья, поделитесь ею и оставьте отзыв. Ваша поддержка как писателя значит для меня весь мир!
Прочтите больше статей по теме: