Преобразование столбцов Pandas с помощью map и apply
В этом уроке вы узнаете, как преобразовывать столбцы вашего DataFrame в pandas с использованием векторизированных функций и пользовательских функций с помощью методов map и apply. К концу этого урока у вас будет прочное понимание того, как pandas применяет векторизированные функции и как они оптимизированы для производительности. Вы также узнаете, как использовать пользовательские функции для преобразования и манипулирования данными с помощью методов .map() и .apply()
.
Маппинг — это термин из математики. Он означает применение функции к одному набору значений и получение другого набора значений. Это также типичная задача, которую вам придется решать в своем пути данных: создание новых представлений ваших данных или преобразование данных в новый формат. Pandas предоставляет множество способов для выполнения этих задач, позволяя работать с векторизированными функциями, методом .map()
и методом .apply(
).
Оглавление
Загрузка примера DataFrame в pandas
Загрузка примера DataFrame в pandas Чтобы следовать за этим уроком, скопируйте приведенный ниже код для загрузки примерного DataFrame в pandas. Набор данных предоставляет множество полезных столбцов, позволяющих нам манипулировать и преобразовывать наши данные разными способами.
Приведенный выше код загружает DataFrame df с пятью столбцами: name и score имеют строковый тип данных, age и income — целочисленный, а age_missing_data — число с плавающей точкой, включающее пропущенное значение. Набор данных намеренно сделан небольшим, чтобы легче было понять происходящее. Давайте начнем!
Понимание векторизированных функций в pandas
При чтении документации по pandas вы можете встретить термин «векторизация». В большинстве случаев это относится к функциям или методам, встроенным в библиотеку, и поэтому оптимизированным для скорости и эффективности. Суть в том, что pandas может применять один набор инструкций к нескольким элементам данных одновременно.
Почему это быстрее? Представьте цикл for: на каждой итерации выполняется одно действие. Только после завершения действия цикл переходит к следующей итерации. В то же время векторизация позволяет нам обойти это ограничение и применить функцию или преобразование к нескольким шагам одновременно. Это позволяет нашим компьютерам обрабатывать процессы параллельно.
Фактически, вы, возможно, уже использовали векторизированные выражения, не подозревая об этом! Когда вы применяете, например, .mean() к столбцу pandas, вы используете векторизированный метод. Давайте визуализируем, как это можно сделать с помощью цикла for и с использованием векторизированной функции.
Конечно, метод с циклом for значительно упрощен по сравнению с другими методами, которые вы узнаете ниже, но он иллюстрирует основную идею! Между этими двумя реализациями также есть значительные различия в производительности.
Использование метода map в pandas
Метод .map() pandas можно применять к Pandas Series, то есть к столбцу DataFrame. Функция map интересна тем, что может принимать три разных типа аргументов. Это зависит от того, что вы передаете в метод. Давайте рассмотрим типы объектов, которые можно передать:
Словари: pandas будет использовать
.map()
для сопоставления элементов парами на основе ключа:значениеФункции: pandas будет применять функцию построчно, оценивая ее по значению строки
Series: pandas заменит Series, к которой применяется метод, переданной Series
В следующих разделах мы подробнее рассмотрим каждую из этих сценариев и увидим, как метод .map()
можно использовать для преобразования и сопоставления столбца pandas.
Использование метода map в pandas для сопоставления словаря
Когда вы передаете словарь в метод .map()
, pandas сопоставит значения из соответствующих ключей в словаре. Это работает очень похоже на функцию VLOOKUP в Excel и может быть полезным способом преобразовать данные.
Например, мы могли бы сопоставить пол каждого человека в нашем DataFrame, используя метод .map()
. Давайте определим словарь, где ключи — это люди, а их соответствующий пол — значения ключей.
Теперь, когда наш словарь определён, мы можем применить метод к столбцу name
и передать в него наш словарь, как показано ниже:
Метод .map()
в Pandas работает аналогично функции VLOOKUP в Excel для поиска значений в другой таблице.
Using the Pandas map Method to Map a Function
В этом примере вы узнаете, как применить функцию к колонке Pandas. Делая это, передаваемая функция ожидает одно значение из Series и возвращает преобразованную версию этого значения. В этом случае метод .map()
вернет совершенно новую Series.
Давайте разработаем функцию, которая определяет, выше или ниже средний доход у каждого человека. Затем применим эту функцию с использованием метода .map()
Давайте разберем, что мы здесь сделали:
Мы рассчитали, какой был средний доход, и присвоили его переменной
mean_income
Затем мы определили функцию, которая принимает один аргумент. Ввод анализирует, больше или меньше он среднего значения.
Наконец, функция применяется к столбцу
income
и используется для создания нового столбца в DataFrame.
Может показаться излишним определять функцию, чтобы использовать её только один раз. Поэтому мы можем определить анонимную функцию. Именно этому вы научитесь в следующем разделе.
Использование метода Pandas map для отображения анонимной лямбда-функции
Python позволяет нам определять анонимные функции, lambda-функции, которые являются функциями, определяемыми без имени. Это может быть полезно, когда нам нужно использовать функцию только один раз и мы хотим упростить её использование. Давайте посмотрим, как мы можем воспроизвести пример выше с использованием lambda функции.
Этот процесс немного упрощает чтение вашего кода. Он четко показывает, что функция существует только для этой единственной цели.
Использование метода Pandas map для отображения индексированной серии
В этом последнем примере вы узнаете, как передать объект Pandas Series в метод .map()
. Этот процесс перезаписывает все значения в Series, к которому он применяется, используя значения из переданного Series. Это гораздо более простой пример, где данные просто перезаписываются. Давайте посмотрим, как это может работать:
Давайте посмотрим, что мы сделали: мы создали серию Pandas, используя список фамилий, передавая столбец 'name'
из нашего DataFrame. Это обеспечило однозначное соответствие на основе индекса и столбца.
Использование метода Pandas apply
Pandas также предоставляет другой метод для применения функции — метод .apply()
. Этот метод отличается несколькими важными способами:
Метод
.apply()
может быть применён как к объекту Series, так и к объекту DataFrame в Pandas. Метод.map()
может применяться только к объектуМетод
.apply()
может принимать только вызываемый объект (т.е. функцию)Это можно использовать для агрегации данных, а не просто для отображения преобразования.
Теперь, когда вы знаете некоторые ключевые отличия между этими двумя методами, давайте погрузимся в то, как применить функцию к DataFrame в Pandas.
Использование метода Pandas apply для применения функции
Метод Pandas .apply()
позволяет передавать функцию, которая действует либо на Series, либо на весь DataFrame. Давайте рассмотрим пример, когда мы оцениваем данные не только из одной Series (что можно сделать с помощью .map()
). Создадим колонку, которая принимает во внимание колонки возраста и дохода. Если человек младше 45 лет и его доход превышает 75,000, мы пригласим его на интервью:
Мы видим, что можем применять функцию, которая учитывает более одного столбца! Это может открыть значительные возможности.
Передача аргументов с применением Pandas
Один из менее интуитивных способов использования метода .apply()
заключается в передаче аргументов. Поскольку мы передаем только вызываемый объект (например, имя функции без скобок), нет интуитивно понятного способа передачи аргументов. Давайте определим функцию, где мы можем захотеть изменить ее поведение, используя аргументы:
Преимущество этого подхода заключается в том, что мы можем определить функцию один раз. Это позволяет нам изменять поведение в зависимости от выполнения определенных условий. Например, выше мы можем выбрать, давать бонус или нет.
Влияние производительности Pandas map и apply
Если вы следили за примерами, вы могли заметить, что все примеры выполнялись примерно за одно и то же время. Это в значительной степени связано с тем, что набор данных, который мы использовали, был очень маленьким. Если бы мы попробовали применить некоторые из этих методов на более крупных наборах данных, вы могли бы столкнуться с проблемами производительности.
Это связано с тем, что, как и в нашем примере с циклом for, эти методы перебирают каждую строку DataFrame. Важно стараться оптимизировать ваш код для скорости, особенно при работе с большими наборами данных. Поэтому часто лучше найти встроенную функцию Pandas, нежели использовать свою собственную
Например, мы можем преобразовать предыдущий пример с использованием .map()
в более нативный подход. Давайте определим, выше ли доход человека среднего, используя встроенный векторизированный формат:
Производительность может не казаться важной на начальном этапе, но каждый шаг по модификации данных будет добавлять время к нашей общей работе. При работе с значительно большими наборами данных важно учитывать производительность. Часто полезно начинать с одного процесса, а затем пробовать различные, более быстрые способы достижения того же результата.
Упражнения
Пришло время проверить свои знания. Попробуйте выполнить упражнения ниже. Вы можете найти пример решения, переключив раздел:
Заключение и резюме
В этом учебнике вы научились анализировать и преобразовывать ваш DataFrame Pandas с использованием векторизованных функций, а также методов .map()
и .apply()
. Раздел ниже предоставляет краткое изложение всего, что вы изучили:
Pandas предоставляет множество решений для изменения столбцов в DataFrame.
Векторизованные, встроенные функции позволяют вам применять функции параллельно, обрабатывая несколько записей одновременно.
Метод
.map()
в Pandas может принимать словарь для отображения значений в ключи словаря.Метод
.map()
в Pandas может принимать Series для отображения значений в этом Series на основе его индекса.Метод
.map()
в Pandas позволяет применять функцию к отдельному столбцу.Метод
.apply()
в Pandas может передавать функцию либо одному столбцу, либо всему DataFrame.Методы
.map()
и.apply()
имеют ограничения по производительности по сравнению со встроенными векторизованными функциями. Будьте осторожны с потенциальными замедлениями!
Дополнительные ресурсы
Обратите внимание на учебные пособия ниже по связан
Вычислить средневзвешенное значение в Pandas и Python
Объединение данных в Python с помощью
cut()
PandasСписковые генераторы в Python (полное руководство с примерами)
Last updated