🐼 25 возможностей Pandas, о которых вы не знали
Новые и малоизвестные возможности Pandas, о которых полезно знать каждому специалисту по Data Science.
Сколько раз вы говорили: «было бы здорово, если бы я мог это сделать в Pandas»?
Возможно, вы это и можете! Pandas настолько огромна и глубока, что она позволяет выполнять практически любые операции с таблицами, которые вы можете себе представить. Однако подобная глубина имеет свою цену. Многие элегантные возможности, решающие редко возникающие задачи и уникальные сценарии, теряются в глубинах документации, затертые более часто используемыми функциями.
Эта статья попытается заново открыть для вас многие возможности Pandas и показать, что она может намного больше, чем вам казалось.
1. ExcelWriter
ExcelWriter – это обобщенный класс для создания файлов Excel (с листами!) и записи в них DataFrame. Допустим, у нас есть два набора данных:
У класса есть дополнительные атрибуты для определения используемого формата DateTime: хотите ли вы создать новый файл Excel или изменить существующий, что делать, если лист существует и т. п. Детали см. в документации.
2. pipe
pipe – одна из лучших функций для проведения очистки данных в Pandas кратким и четким образом. Она позволяет объединять несколько пользовательских функций в одну операцию.
Для примера допустим, что у вас есть функции удаления дубликатов (remove_duplicates), удаления выбросов (remove_outliers) и кодирования категориальных признаков (encode_categoricals), каждая со своими аргументами. Вот как вы можете применить все эти функции одной операцией:
Мне нравится, что эта функция похожа на конвейеры Sklearn. Вы можете сделать с ее помощью намного больше – читайте документацию или эту полезную статью.
3. factorize
Эта функция – альтернатива LabelEncoder из Sklearn в Pandas:
В отличие от LabelEncoder'а, factorize возвращает кортеж из двух значений: закодированный столбец и список уникальных категорий.
4. explode – Бабах!
explode – это функция с интересным именем (взрыв). Давайте сначала посмотрим пример, а потом объясним:
В столбце dirty есть две строки, в которых хранятся не единственные значения, а списки. Такие данные часто встречаются в опросах, поскольку некоторые вопросы допускают несколько ответов.
explode распространяет данные из ячейки с массивоподобным значением на несколько строк. Установите ignore_index в True, чтобы сохранить числовой индекс по порядку.
5. squeeze
Еще одна функция с забавным именем – это squeeze (сжатие), используемая в очень редких, но надоедливых случаях. Один из таких случаев – когда запрос подмножества из DataFrame возвращает единственное значение. Рассмотрим следующий пример:
Хотя результат – всего одна ячейка, он возвращается как DataFrame. Это неудобно, поскольку вам придется еще раз использовать .loc и передать как имя столбца, так и индекс, чтобы получить цену.
Но если вы знаете про squeeze, нам не придется этого делать. Эта функция позволяет убрать оси из DataFrame или Series, содержащих единственную ячейку. Например:
Теперь мы получили скалярное значение. Можно также указать, какую ось нужно убрать:
Обратите внимание, что squeeze работает только с DataFrame и Series, имеющими единственное значение.
6. between
Это довольно изящная функция для бинарного индексирования числовых признаков по принадлежности диапазону:
7. T
У всех DataFrame есть простой атрибут T, что значит «транспонирование». Возможно, вы не будете часто его использовать, но я считаю его довольно полезным при выводе DataFrame'ов после метода describe():
Набор данных о недвижимости Бостона содержит 30 числовых столбцов. Если просто вызвать describe, результирующий DataFrame будет сжат по горизонтали, и сравнить статистику будет трудно. Транспонирование поменяет оси местами, и по горизонтали будут уже статистические параметры.
8. Стилизатор Pandas
А вы знали, что Pandas позволяет вам задавать стили DataFrame'ов?
У них есть атрибут style, открывающий дверь к настройкам и стилям, ограниченным только вашими знаниями HTML и CSS. Я не буду рассказывать обо всем, что вы можете сделать с помощью style, покажу лишь свои любимые функции:
Мы выделили ячейки, содержащие максимальные значения каждого столбца. Еще один полезный стилизатор – background_gradient, присваивающий ячейкам градиентный фоновый цвет на основе их значений:
Это особенно полезно, если вы вызываете describe для таблицы со множеством столбцов и хотите сравнить суммарную статистику. Подробности см. в документации по стилизатору.
9. Опции Pandas
Как и в Matplotlib, в Pandas есть глобальные настройки, которые можно изменять для настройки поведения по умолчанию:
Эти настройки разделены на 5 модулей. Давайте посмотрим, какие настройки есть в модуле display:
В группе display много настроек, но я в основном использую max_columns и precision:
Больше подробностей об этих замечательных настройках можно найти в документации.
10. convert_dtypes
Все мы знаем, что Pandas имеет раздражающую привычку присваивать столбцам тип данных object. Вместо того чтобы назначать типы данных вручную, вы можете использовать метод convert_dtypes, который пытается подобрать наиболее подходящий тип данных:
К сожалению, метод не может разбирать даты из-за нюансов различных форматов их представления.
11. select_dtypes
Функция, которую я использую постоянно – это select_dtypes. Ее функционал очевиден из ее названия: выбор по типам данных. У нее есть параметры include и exclude, позволяющие выбрать столбцы, включая или исключая определенные типы данных. Например, можно выбрать только числовые столбцы, указав np.number:
или, наоборот, исключить их:
12. mask
Функция mask позволяет быстро заменять значения в тех ячейках, для которых выполняется определенное условие. Предположим, что у нас есть данные опроса людей от 50 до 60:
Мы будем считать возраст, выходящий за границы от 50 до 60 лет, ошибками ввода (таких ошибок две – 49 и 66 лет), которые заменим на NaN:
Таким образом, mask заменяет значения ячеек, не удовлетворяющие cond, значениями other.
13. min и max по строкам и столбцам
Хотя функции min и max широко известны, они имеют еще одно применение, полезное для особых случаев. Давайте рассмотрим следующий набор данных:
Этот DataFrame содержит воображаемую точность моделей, полученных в результате четырех видов градиентного бустинга на пяти различных наборах данных. Мы хотим найти лучшую точность на каждом наборе. Вот как элегантно это можно сделать с помощью max:
Если вы хотите найти максимум или минимум по каждому столбцу, достаточно изменить 1 на 0.
14. nlargest и nsmallest
Иногда вам недостаточно получить максимальное или минимальное значение столбца. Вы хотите получить N максимальных (или минимальных) значений. Для этого пригодятся функции nlargest и nsmallest. Давайте выведем 5 самых дорогих и самых дешевых бриллиантов:
15. idxmax и idxmin
Когда вы вызываете max или min для столбца, pandas возвращает максимальное или минимальное значение. Однако иногда вам нужна позиция этого значения, а не оно само. Для этого используйте функции idxmax и idxmin:
Можно также задать axis='columns', при этом функции будут возвращать номер индекса нужного столбца.
16. value_counts с параметром dropna=False
Для нахождения процента пропущенных значений чаще всего используется комбинация isnull и sum и деление на длину массива. Но вы можете сделать то же самое с помощью value_counts, если задать соответствующие аргументы:
В этом столбце 47% пустых значений (NaN).
17. clip
Обнаружение и удаление выбросов часто используется в анализе данных. Функция clip позволяет очень легко найти выбросы, выходящие за пределы диапазона и заменить их предельными значениями. Давайте вернемся к примеру с возрастами людей от 50 до 60:
На этот раз мы заменим значения, выходящие за диапазон от 50 до 60, крайними значениями диапазона.
Быстро и эффективно!
18. at_time и between_time
Эти функции могут пригодиться при работе с данными, разделенными по времени с высокой степенью детализации. Давайте создадим таблицу, содержащую 100 часовых интервалов:
Функция at_time позволяет выбирать значения по заданным дате или времени. Давайте выделим все строки, соответствующие 15.00:
Здорово, правда? А теперь давайте используем between_time, чтобы выделить строки в заданном интервале времени:
Заметьте, что обе функции требуют DateTimeIndex, и они работают только с временем. Если вы хотите выделить строки в определенном интервале DateTime, используйте between.
19. bdate_range
bdate_range – это функция для быстрого создания индексов TimeSeries с частотой в один бизнес-день.
Частота в бизнес-день часто встречается в финансовом мире. Значит, эта функция может оказаться полезной для переиндексирования существующих временных интервалов функцией reindex.
20. autocorr
Один из важнейших компонентов анализа временных последовательностей – это изучение автокорреляции переменной. Автокорреляция – это старый добрый коэффициент корреляции, но взятый по сравнению с лагом той же последовательности. Точнее, автокорреляция при lag=k вычисляется следующим образом:
1. Последовательность сдвигается k периодов времени:
2. Рассчитывается корреляция между исходным значением и каждым лагом.
Вместо того чтобы делать все это вручную, вы можете использовать функцию Pandas autocorr:
О важности автокорреляции для анализа временных рядов можно прочитать в этой статье.
21. hasnans
Pandas предлагает метод для простой проверки, содержит ли Series какие-либо пустые значения – атрибут hasnans:
Согласно его документации, атрибут существенно ускоряет производительность. Заметьте, что он работает только для Series.
22. at и iat
Эти два метода доступа к значениям – гораздо более быстрые альтернативы loc и iloc, но с существенным недостатком: они позволяют получить или изменить только одно значение:
23. argsort
Эту функцию стоит использовать каждый раз, когда вы хотите выделить индексы, образующие отсортированный массив:
24. Метод доступа cat
Общеизвестно, что Pandas позволяет использовать встроенные функции Python на датах и строках с помощью методов доступа вроде dt или str. Кроме того, в Pandas есть специальный тип данных category для категориальных переменных, как показано ниже:
Если столбец имеет тип category, над ним можно выполнять несколько специальных функций с помощью метода доступа cat. Например, давайте рассмотрим различные виды огранки бриллиантов:
Есть и такие функции, как remove_categories, rename_categories и т. д.:
Полный список функций, доступных через метод доступа cat, можно посмотреть здесь.
25. GroupBy.nth
Эта функция работает только для объектов GroupBy. После группировки она возвращает n-ю строку каждой группы:
Заключение
Несмотря на то, что новые библиотеки вроде Dask и datatable потихоньку вытесняют Pandas благодаря их сверкающим новым возможностям для обработки огромных массивов данных, Pandas по-прежнему остается самым популярным средством манипуляции данными в экосистеме Data Science на Python.
Эта библиотека – образец для подражания, который другие пытаются имитировать и улучшить, поскольку она прекрасно интегрируется в современный стек SciPy.
Спасибо за внимание!
Материалы по теме
- 📊 Инструменты дата-журналиста #1: Jupyter Notebook и библиотека Pandas
- 🤖 Numpy, Pandas, matplotlib – необходимый минимум для старта в Machine Learning
- 📊Django, Pandas и Chart.js для быстрой панели инструментов