Понимание функции transform в Pandas

Open in Colab


telegram

Введение

Одной из привлекательных особенностей pandas является наличие богатой библиотеки методов для управления данными. Однако бывают случаи, когда неясно, что делают функции и как их использовать. Если вы подходите к проблеме с точки зрения Excel, может быть сложно перевести решение в незнакомую команду pandas. Одна из таких "неизвестных" функций - метод transform.

Оригинал статьи Криса тут

Даже после длительного использования pandas у меня никогда не было возможности использовать эту функцию, поэтому я потратил время на выяснение, как она может пригодиться для анализа реального мира. В этой статье будет рассмотрен пример, в котором transform используется для эффективного суммирования данных.

Что такое трансформация?

Лучшее описание этой темы я нашел в книге Python Data Science Handbook Джейка Вандерпласа (Jake VanderPlas).

книга в оригинале свободно доступна на сайте

Как сказано в книге, transform - это операция, используемая вместе с groupby (которая является одной из самых полезных в pandas).

Я подозреваю, что большинство пользователей pandas использовали aggregate, filter или apply с groupby для обобщения данных. Однако transform немного сложнее понять, особенно из мира Excel.

Поскольку Джейк сделал свою книгу доступной через Jupyter блокноты, это хорошее место, чтобы понять уникальность transform:

В то время как агрегирующая функция должна возвращать сокращенную версию данных, преобразование может вернуть версию полного набора данных, преобразованную ради дальнейшей их перекомпоновки. При подобном преобразовании форма выходных данных совпадает с формой входных. Распространенный пример — центрирование данных путем вычитания среднего значения по группам.

Используя это базовое определение, я рассмотрю еще один пример.

Набор данных

В этом примере проанализируем фиктивные данные о сделках купли-продажи:

Вы можете видеть, что файл содержит три разных заказа (10001, 10005 и 10006) и что каждый заказ состоит из нескольких продуктов (sku).

Вопрос, на который мы бы хотели ответить: "Какой процент от общей суммы составляет каждый продукт (sku)?"

Например, если мы посмотрим на заказ 10001 на общую сумму 576,12 у.е., то разбивка будет следующая:

B1-20000 = $235.83 или 40.9%

S1-27722 = $232.32 или 40.3%

B1-86481 = $107.97 или 18.7%

Сложность заключается в том, что нам нужно получить общую сумму для каждого заказа и объединить ее обратно на уровне транзакции, чтобы получить проценты.

В Excel вы можете использовать какую-либо версию промежуточного итога, чтобы вычислить значения.

Первый подход - merge

Если вы знакомы с pandas, то первым желанием будет сгруппировать данные в новый DataFrame и затем объединить их.

Вот как будет выглядеть этот подход. Определим итоговую сумму (ext price) для заказов (order) с помощью стандартной groupby агрегации:

Вот схема, показывающая, что происходит в стандартной функции groupby:

Сложная часть - придумать, как объединить полученные данные обратно с исходным DataFrame.

Первое желание - создать новый DataFrame с итогами по заказам (order) и затем объединить его с оригиналом с помощью merge.

Мы могли бы сделать что-то вроде такого:

Безусловно, этот способ работает, но необходимо выполнить несколько шагов, чтобы объединить данные нужным нам образом!

Второй подход - использование transform

Используя исходные данные, давайте попробуем вызвать transform для результата groupby:

Вместо того, чтобы показывать только итоги по трем заказам (orders), transform сохраняет формат исходного набора данных. Это уникальная особенность transform!

Последний шаг довольно прост:

В качестве дополнительного бонуса можно объединить все в один отчет, если не хотите отображать итоги отдельных заказов:

Вот схема, показывающая, что происходит:

Потратив время на понимание transform, я думаю, вы согласитесь, что этот инструмент может быть очень мощным, даже, если это отличный от стандартного мышления Excel подход.

Заключение

Я постоянно поражаюсь способности pandas делать сложные числовые манипуляции очень эффективными. Несмотря на то, что я длительное время работал с pandas, я никогда не тратил время на понимание работы transform. Теперь, когда я знаю, как это работает, уверен, что смогу использовать его в будущем анализе, и надеюсь, что вы сочтете этот пример полезным.