ИЗМЕНЕНИЕ ФРАМОВ ДАННЫХ С 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(). Иногда, когда вы группируете по многим переменным, неизбежно будет NaNs. В 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.

Если вам понравилась статья, поделитесь ею и оставьте отзыв. Ваша поддержка как писателя значит для меня весь мир!

Прочтите больше статей по теме: