Я и раньше писал о Pandas по очевидным причинам — это изумительная библиотека для анализа данных и даже для визуализации. Предыдущая статья была о функциях, которые стоит чаще использовать, потому что они: 

  • держат ваш код в чистоте;
  • не заставляют вас заново изобретать колесо.

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

Конечный результат был разочаровывающим. Я реализовывал необходимую логику, но ценой нескольких лишних часов, седых волос и, безусловно, кучи ненужного кода. 

Ниже перечисленные функции помогут избежать подобных ошибок. 

idxmin() и idxmax()

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

Вкратце, эти функции возвращают ID (индекс) нужной записи. Скажем, я создам следующий массив Pandas:

И хочу найти индексы наименьшего и наибольшего элементов. Разумеется, очень легко найти их и так, но никогда (я действительно имею в виду никогда) не бывает настолько мало данных в проектах. 

Это означает, что эти функции вам точно пригодятся. Давайте посмотрим, как: 

Имейте в виду, что функции возвращают индекс первого наблюдаемого наименьшего или наибольшего значений. 

ne()

Эта функция стала для меня открытием. Некоторое время назад я работал с временными данными, и у меня возникли проблемы, когда несколько первых наблюдаемых значений были равны 0. 

Проще говоря, представьте, что вы купили что-то, но не использовали в течение некоторого времени. Вещь находится в вашем распоряжении, но, раз вы ее не используете, потребление в этот период равно 0. В случае, если меня интересует именно потребление и оно начинается с момента фактического использования вещи, функция ne() прекрасно подойдет.

Давайте рассмотрим следующий сценарий: у вас есть объект Pandas DataFrame с несколькими нулевыми значениями в начале: 

Функция ne() вернет True, если текущее значение не равно заданному (скажем 0), и False в обратном случае:

Само по себе это не очень полезно. Помните, что выше я отметил, что вам нужно знать idxmax(), чтобы понять эту тему? Что ж, вот и оно, вы можете включить idxmax() в код ниже: 

Итак, в индексе 6 у нас впервые появляется ненулевое значение. Еще раз — это пока еще не представляет большой ценности. А вот что действительно можно сделать, так это использовать эту информацию, чтобы DataFrame выводил только значения, начинающиеся с того момента, когда элемент был впервые использован: 

И это полезно каждый раз, когда вы имеете дело с временными данными. 

nsmallest() и nlargest()

Я думаю, вы догадались о назначении этих функций по именам. Скажем, я создам следующий объект DataFrame:

Давайте предположим, что это 5 записей баллов, полученных после написания теста. И нам нужно найти трех студентов, которые справились хуже всех:

Или трех студентов, которые справились лучше всех:

Эти две функции являются отличной заменой таким функциям, как sort_values().

Читайте также:


Перевод статьи Dario Radečić: Top 3 Pandas Functions You Don’t Know About (Probably)

Предыдущая статья11 главных фронтенд-трендов на 2020 год
Следующая статья11 сверхполезных советов для JavaScript разработки