10 трюков библиотеки Python Pandas, которые вам нужны


Оглавление (нажмите, чтобы открыть):

Аналитикам: большая шпаргалка по Pandas

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

Что такое Pandas и зачем он нужен

Pandas — это библиотека для работы с данными на Python. Она упрощает жизнь аналитикам: где раньше использовалось 10 строк кода теперь хватит одной.

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

В Pandas всё проще. Во-первых, не нужно думать, как будут храниться данные — они лежат в датафрейме. Во-вторых, достаточно написать одну команду:

Pandas добавляет в Python новые структуры данных — серии и датафреймы. Расскажу, что это такое.

Структуры данных: серии и датафреймы

Серии — одномерные массивы данных. Они очень похожи на списки, но отличаются по поведению — например, операции применяются к списку целиком, а в сериях — поэлементно.

То есть, если список умножить на 2, получите тот же список, повторенный 2 раза.

А если умножить серию, ее длина не изменится, а вот элементы удвоятся.

Обратите внимание на первый столбик вывода. Это индекс, в котором хранятся адреса каждого элемента серии. Каждый элемент потом можно получать, обратившись по нужному адресу.

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

Теперь можем получать значения каждого месяца:

Так как серии — одномерный массив данных, в них удобно хранить измерения по одному. На практике удобнее группировать данные вместе. Например, если мы анализируем помесячные продажи, полезно видеть не только выручку, но и количество проданных товаров, количество новых клиентов и средний чек. Для этого отлично подходят датафреймы.

Датафреймы — это таблицы. У их есть строки, колонки и ячейки.

Технически, колонки датафреймов — это серии. Поскольку в колонках обычно описывают одни и те же объекты, то все колонки делят один и тот же индекс:

Объясню, как создавать датафреймы и загружать в них данные.

Создаем датафреймы и загружаем данные

Бывает, что мы не знаем, что собой представляют данные, и не можем задать структуру заранее. Тогда удобно создать пустой датафрейм и позже наполнить его данными.

А иногда данные уже есть, но хранятся в переменной из стандартного Python, например, в словаре. Чтобы получить датафрейм, эту переменную передаем в ту же команду:

Случается, что в некоторых записях не хватает данных. Например, посмотрите на список goods_sold — в нём продажи, разбитые по товарным категориям. За первый месяц мы продали машины, компьютеры и программное обеспечение. Во втором машин нет, зато появились велосипеды, а в третьем снова появились машины, но велосипеды исчезли:

Если загрузить данные в датафрейм, Pandas создаст колонки для всех товарных категорий и, где это возможно, заполнит их данными:

Обратите внимание, продажи велосипедов в первом и третьем месяце равны NaN — расшифровывается как Not a Number. Так Pandas помечает отсутствующие значения.

Теперь разберем, как загружать данные из файлов. Чаще всего данные хранятся в экселевских таблицах или csv-, tsv- файлах.

Экселевские таблицы читаются с помощью команды pd.read_excel() . Параметрами нужно передать адрес файла на компьютере и название листа, который нужно прочитать. Команда работает как с xls, так и с xlsx:

Файлы формата csv и tsv — это текстовые файлы, в которых данные отделены друг от друга запятыми или табуляцией:

Оба читаются с помощью команды .read_csv() , символ табуляции передается параметром sep (от англ. separator — разделитель):

При загрузке можно назначить столбец, который будет индексом. Представьте, что мы загружаем таблицу с заказами. У каждого заказа есть свой уникальный номер, Если назначим этот номер индексом, сможем выгружать данные командой df[order_id] . Иначе придется писать фильтр df[df[‘ >.

О том, как получать данные из датафреймов, я расскажу в одном из следующих разделов. Чтобы назначить колонку индексом, добавим в команду read_csv() параметр index_col , равный названию нужной колонки:

После загрузки данных в датафрейм, хорошо бы их исследовать — особенно, если они вам незнакомы.

Исследуем загруженные данные

Представим, что мы анализируем продажи американского интернет-магазина. У нас есть данные о заказах и клиентах. Загрузим файл с продажами интернет-магазина в переменную orders . Раз загружаем заказы, укажем, что колонка id пойдет в индекс:

Расскажу о четырех атрибутах, которые есть у любого датафрейма: .shape , .columns , .index и .dtypes .

.shape показывает, сколько в датафрейме строк и колонок. Он возвращает пару значений (n_rows, n_columns) . Сначала идут строки, потом колонки.

В датафрейме 5009 строк и 5 колонок.

Окей, масштаб оценили. Теперь посмотрим, какая информация содержится в каждой колонке. С помощью .columns узнаем названия колонок:

Теперь видим, что в таблице есть дата заказа, метод доставки, номер клиента и выручка.

С помощью .dtypes узнаем типы данных, находящихся в каждой колонке и поймем, надо ли их обрабатывать. Бывает, что числа загружаются в виде текста. Если мы попробуем сложить две текстовых значения ‘1’ + ‘1’ , то получим не число 2, а строку ’11’ :

Тип object — это текст, float64 — это дробное число типа 3,14.

C помощью атрибута .index посмотрим, как называются строки:

Ожидаемо, в индексе датафрейма номера заказов: 100762, 100860 и так далее.

В колонке sales хранится стоимость каждого проданного товара. Чтобы узнать разброс значений, среднюю стоимость и медиану, используем метод .describe() :

Наконец, чтобы посмотреть на несколько примеров записей датафрейма, используем команды .head() и .sample() . Первая возвращает 6 записей из начала датафрейма. Вторая — 6 случайных записей:

Получив первое представление о датафреймах, теперь обсудим, как доставать из него данные.

Получаем данные из датафреймов

Данные из датафреймов можно получать по-разному: указав номера колонок и строк, использовав условные операторы или язык запросов. Расскажу подробнее о каждом способе.

Указываем нужные строки и колонки

Продолжаем анализировать продажи интернет-магазина, которые загрузили в предыдущем разделе. Допустим, я хочу вывести столбец sales . Для этого название столбца нужно заключить в квадратные скобки и поставить после них названия датафрейма: orders[‘sales’] :

Обратите внимание, результат команды — новый датафрейм с таким же индексом.

Если нужно вывести несколько столбцов, в квадратные скобки нужно вставить список с их названиями: orders[[‘customer_id’, ‘sales’]] . Будьте внимательны: квадратные скобки стали двойными. Первые — от датафрейма, вторые — от списка:

Перейдем к строкам. Их можно фильтровать по индексу и по порядку. Например, мы хотим вывести только заказы 100363, 100391 и 100706, для этого есть команда .loc[] :

А в другой раз бывает нужно достать просто заказы с 1 по 3 по порядку, вне зависимости от их номеров в таблицемы. Тогда используют команду .iloc[] :

Можно фильтровать датафреймы по колонкам и столбцам одновременно:

Часто вы не знаете заранее номеров заказов, которые вам нужны. Например, если задача — получить заказы, стоимостью более 1000 рублей. Эту задачу удобно решать с помощью условных операторов.

Если — то. Условные операторы

Задача: нужно узнать, откуда приходят самые большие заказы. Начнем с того, что достанем все покупки стоимостью более 1000 долларов:

Помните, в начале статьи я упоминал, что в сериях все операции применяются по-элементно? Так вот, операция orders[‘sales’] > 1000 идет по каждому элементу серии и, если условие выполняется, возвращает True . Если не выполняется — False . Получившуюся серию мы сохраняем в переменную filter_large .

Вторая команда фильтрует строки датафрейма с помощью серии. Если элемент filter_large равен True , заказ отобразится, если False — нет. Результат — датафрейм с заказами, стоимостью более 1000 долларов.

Интересно, сколько дорогих заказов было доставлено первым классом? Добавим в фильтр ещё одно условие:

Логика не изменилась. В переменную filter_large сохранили серию, удовлетворяющую условию orders[‘sales’] > 1000 . В filter_first_class — серию, удовлетворяющую orders[‘ship_mode’] == ‘First’ .

Затем объединили обе серии с помощью логического ‘И’: filter_first_class & filter_first_class . Получили новую серию той же длины, в элементах которой True только у заказов, стоимостью больше 1000, доставленных первым классом. Таких условий может быть сколько угодно.

Язык запросов

Еще один способ решить предыдущую задачу — использовать язык запросов. Все условия пишем одной строкой ‘sales > 1000 & ship_mode == ‘First’ и передаем ее в метод .query() . Запрос получается компактнее.

Отдельный кайф: значения для фильтров можно сохранить в переменной, а в запросе сослаться на нее с помощью символа @: sales > @sales_filter .

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

Считаем производные метрики

Задача: посчитаем, сколько денег магазин заработал с помощью каждого класса доставки. Начнем с простого — просуммируем выручку со всех заказов. Для этого используем метод .sum() :

Добавим класс доставки. Перед суммированием сгруппируем данные с помощью метода .groupby() :

3.514284e+05 — научный формат вывода чисел. Означает 3.51 * 10 5 . Нам такая точность не нужна, поэтому можем сказать Pandas, чтобы округлял значения до сотых:

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

Видно, что выручка прыгает ото дня ко дню: иногда 10 долларов, а иногда 378. Интересно, это меняется количество заказов или средний чек? Добавим к выборке количество заказов. Для этого вместо .sum() используем метод .agg() , в который передадим список с названиями нужных функций.

Ого, получается, что это так прыгает средний чек. Интересно, а какой был самый удачный день? Чтобы узнать, отсортируем получившийся датафрейм: выведем 10 самых денежных дней по выручке:

Команда разрослась, и её теперь неудобно читать. Чтобы упростить, можно разбить её на несколько строк. В конце каждой строки ставим обратный слеш \ :

В самый удачный день — 18 марта 2014 года — магазин заработал 27 тысяч долларов с помощью стандартного класса доставки. Интересно, откуда были клиенты, сделавшие эти заказы? Чтобы узнать, надо объединить данные о заказах с данными о клиентах.

Объединяем несколько датафреймов

До сих пор мы смотрели только на таблицу с заказами. Но ведь у нас есть еще данные о клиентах интернет-магазина. Загрузим их в переменную customers и посмотрим, что они собой представляют:

Мы знаем тип клиента, место его проживания, его имя и имя контактного лица. У каждого клиента есть уникальный номер id . Этот же номер лежит в колонке customer_id таблицы orders . Значит мы можем найти, какие заказы сделал каждый клиент. Например, посмотрим, заказы пользователя CG-12520 :

Вернемся к задаче из предыдущего раздела: узнать, что за клиенты, которые сделали 18 марта заказы со стандартной доставкой. Для этого объединим таблицы с клиентами и заказами. Датафреймы объединяют с помощью методов .concat() , .merge() и .join() . Все они делают одно и то же, но отличаются синтаксисом — на практике достаточно уметь пользоваться одним из них.

Покажу на примере .merge() :

В .merge() я сначала указал названия датафреймов, которые хочу объединить. Затем уточнил, как именно их объединить и какие колонки использовать в качестве ключа.

Ключ — это колонка, связывающая оба датафрейма. В нашем случае — номер клиента. В таблице с заказами он в колонке customer_id , а таблице с клиентами — в индексе. Поэтому в команде мы пишем: left_on=’customer_ >.

Решаем задачу

Закрепим полученный материал, решив задачу. Найдем 5 городов, принесших самую большую выручку в 2020 году.

Для начала отфильтруем заказы из 2020 года:

Город — это атрибут пользователей, а не заказов. Добавим информацию о пользователях:

Cруппируем получившийся датафрейм по городам и посчитаем выручку:

Отсортируем по убыванию продаж и оставим топ-5:

Возьмите данные о заказах и покупателях и посчитайте:

  1. Сколько заказов, отправлено первым классом за последние 5 лет?
  2. Сколько в базе клиентов из Калифорнии?
  3. Сколько заказов они сделали?
  4. Постройте сводную таблицу средних чеков по всем штатам за каждый год.

Через некоторое время выложу ответы в Телеграме. Подписывайтесь, чтобы не пропустить ответы и новые статьи.

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

Анализ данных с помощью pandas. Часть 0: введение, jupyter (ipython)

pandas — это Python библиотека для анализа и обработки данных. Она действительно быстрая и позволяет вам легко исследовать данные.

Цель этого цикла статей — дать конкретные примеры использования pandas.

Быстрый тур в IPython Notebook

Будет полезным повторить это в интерактивном режиме, поэтому лучше установить ipython с помощью pip:

После чего можно запустить сеанс ipython просто написав:

После этого в браузере откроется сервер jupyter. Создадим Python 3 notebook.

Во-первых, запустим код из ячейки.

Помимо этой кнопки, можно запускать код из ячейки с помощью Ctrl+Enter.

Одна из самых полезных вещей в IPython notebook это автодополнение.

Попробуйте следующее: нажмите в ячейке сразу после read_csv( и нажмите Shift+Tab 4 раза, медленно. Посмотрите, что получится.

Вот что получается после 2 раз:

Хорошо, теперь попробуем автодополнение. Введите pd.r (первая буква функции) и посмотрите, какие варианты предлагаются.

Вы должны увидеть следующее:

Написание кода

Написание кода в ячейках абсолютно естественно.

Python. Библиотека Pandas.

Pandas — это динамично развивающаяся библиотека для анализа данных на языке Python. В основе использует возможности библиотеки NumPy. Pandas позволяет просто выполнять различные манипуляции над табличными данными и временными рядами, выполнять срезы данных и т.д. Библиотека была написана на языке Python, однако наиболее критические ее части реализованы при помощи Cython и C. Если вы не слышали о Cython, то это язык, синтаксис которого схож с Python, однако программа перед компиляций транслируется в код на языке C.

Основными структурами данных в Pandas являются Series и DataFrame.

Series — это простой проиндексированный одномерный массив элементов. Обращение к элементу осуществляется по ключу. В этом данная структура напоминает стандартный словарь — dict.

DataFrame — это уже многомерный массив элементов, где каждый столбец является объектом Series.

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

Первым делом я загружу данные для анализа из открытого репозитория UCI. Это данные для оценки качества белого вина. Если хотите, то можете загрузить эти данные, перейдя по ссылке.

Импортируем библиотеку Pandas:

Прочитать данные из файла в формате *.csv можно при помощи функции read_csv():

Данной функции мы передаем три параметра: первый — это полное имя нашего файла и путь к нему, второй параметр указывает на то, есть ли в нашем файле строка с заголовками (в нашем случае заголовки имеются). Наконец, третий параметр — это используемый разделитель.

Теперь давайте выведем наш DataFrame на экран:

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

Таблица имеет двенадцать столбцов с заданными именами. Также мы можем получить их список, воспользовавшись свойством columns:

Узнать тип данных в каждом столбце можно, обратившись к свойству dtypes нашего DataFrame:

Получим краткую информацию по нашему DataFrame:

Также мы можем работать со срезами данных. Давайте выведем на экран первые 5 строк таблицы:

Добавление новых данных.

Мы можем добавить в нашу таблицу новые данные. Для этого нужно создать словарь, содержащий атрибуты и их значения, а затем вызвать функцию append(). Наш словарь добавится в таблицу в виде отдельной строчки:

Функция append() не изменяет текущий DataFrame, а возвращает ссылку на новый объект, содержащий внесенные изменения. Параметр ignore_index означает, что данные могут добавиться в любое место таблицы.

Давайте выведем нашу таблицу на экран:

И мы видим, что последняя строка соответствует нашим добавленным данным.

Добавление новых столбцов (ключей).

Добавить новый столбец в DataFrame очень просто. Мы просто записываем его имя в квадратных скобках и присваиваем какие-то значения в каждой строке. Вино же может быть бесплатным?:)

Теперь выведем наш DataFrame на экран:


Вот так просто мы добавили в описание наших объектов новый параметр.

Мастер Йода рекомендует:  5 основополагающих принципов интернет-маркетинга для ведения успешного бизнеса

Также мы могли бы вывести данные только по этому столбцу:

Фильтрация данных.

Часто нам необходимо вывести только те данные, которые удовлетворяют некоторому условию, то есть выполнить фильтрацию данных. Давайте выведем только те записи, значения quality в которых больше 8:

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

Можно выполнять фильтрацию и по нескольким условиям:

Объединение данных из нескольких источников.

Часто данные к нам попадают из совершенно разных источников и их нужно объединить для последующего анализа. Допустим, мы выполняем анализ всех видов вин — не только белого. У нас есть файл winequality-red.csv, содержащий те же данные, но уже для красного вина. Объединить наборы данных вместе можно вызовом функции merge(). Данная функция работает аналогично соединению join в языке SQL.

Заполнение пропусков в данных.

Иногда наши данные содержат пустые значения и для выбора того или иного алгоритма может понадобиться заменить эти значения каким-то другим, стандартным значением, пригодным для решения поставленной задачи. Это можно осуществить при помощи функции fillna():

Параметр inplace говорит о том, что изменения будут применены к оригинальному DataFrame. В обратном случае мы получим измененную копию.

Анализ данных с pandas

Опубликовано shwan в 20.02.2020 20.02.2020

Анализ данных сегодня становится все более и более популярным. Нынче аналитику данных нужно не только владеть Excel’ем, а и иметь навыки работы с языком Python как минимум. «Питон» имеет огромное множество библиотек для анализа данных, самой популярной из которых является pandas.

Введение

Pandas — библиотека для анализа и обработки данных. Работа с этой библиотекой происходит над массивами NumPy. Основные два класса в Pandas — Series и DataFrame. DataFrame содержит множество объектов Series и имеет множество методов для обработки данных в ним.

Сегодня мы рассмотрим базовые функции pandas на примере набора данных «Iris», пару способов нормализации числовых значений и визуализации данных.

Сам датасет является набором для мультиклассовой классификации, предоставленный Рональдом Фишером в 1936 году для демонстрации разработанного им метода дискретного анализа.

Начало работы

Использовать для работы мы будем Jupyter Notebook — инструмент, который в представлении не нуждается.

Для начала импортируем все необходимые модули:

Импортируем pandas, matplotlib.pyplot для построения зависимостей между признаками, numpy для работы с массивами и сам датасет.

Загружаем датасет. Не будем углубляться в его структуру, можно представить его в качестве словаря, ключи которого вы видите на экране.

Перечислим термины, которые далее будем использовать:

  • класс — определенная метка, к которому мы будем относить набор
  • признак — названия «полей» набора

Вот что значат данные метки:

  • data — двумерный массив с наборами чисел
  • target_names — названия классов, между которыми мы распределяем наборы
  • target — одномерный массив с числовыми значениями меток классов
  • feature_names — массив с названиями признаков
  • DESCR(ук. от description) — описание набора. Очень рекомендуется к прочтению.

Создаём объект DataFrame из полученного набора:

Здесь мы передаём сами значения, а в именнованом параметре columns указываем названия столбцов таблицы. Также мы воспользовались методов DataFrame.info(), который выведет нам исчерпывающую информацию о наборе. Отсюда мы можем узнать, что набор содержит 150 строк, 4 колонки, узнаем имена признаков(мы их знали изначально, однако если бы загружали датасет из .csv или .json файла, это могло бы нам пригодится). Также получим информацию, что все столбцы не содержат значений NaN(Not a Number) и принадлежат к типу float64.

Затем дополним наш DataFrame столбцом меток классов:

Здесь мы воспользовались методом DataFrame.head(), в который можно передать числовое значение(по умолчанию 5), которое указывает на кол-во строк таблицы, которые необходимо вывести на экран.

Анализ набора

Чтобы узнать, какие уникальные значения содержит отдельный столбец, воспользуемся методом Series.value_counts().

Как мы видим, к отдельному столбцу мы можем обратиться как к полю класса, если имя столбца полностью выполняет правила именования переменных Python.

Столбец Class содержит три уникальных значения, по 50 раз каждое.

Чтобы узнать минимальное и максимальное значения столбца, воспользуемся методами Series.min() и Series.max() соответственно.

Теперь построим матрицу рассеивания, используя под-модуль pandas.plotting.

Передаем в качестве аргументов сам DataFrame, прозрачность и размер фигуры.

Использовав магическую команду IPython, выводим изображение прямо в JupyterNotebook.

Здесь мы видим зависимости между каждыми двумя признаками. Меня наиболее заинтересовали признаки ‘sepal length (cm)’ и ‘petal length (cm)’.

Как мы можем заметить, мы получили доступ к двум столбцам таблицы, передав массив названий нужных нам признаков в квадратные скобки, остальные параметры оставляем прежними.

Здесь мы можем заметить множество точек, которые находятся отдалённо от других. Сразу появляется подозрение, что эти точки принадлежат к одному классу, что означает легкое отделение этого класса от других.

Заметим, что данные точки имеют довольно маленькое значение sepal lenght(картинка слева внизу), что мы докажем, выполнив фрагмент кода ниже:

Здесь мы использовали выбор по маске(оператор == переопределён в DataFrame, возвращает массив с булевыми значениями), передав его в квадратные скобки, выбрав все строки, которые относятся к классу 0.

Как мы можем заметить, первый класс имеет довольно маленькое значение признака sepal lenght — всего 5.8, когда весь набор имеет максимальное значение, равное 7.9.

Чтобы подтвердить наши догадки, воспользуемся matplotlib. Построим такую же диаграмму, только распределим классы по цветам.

Воспользуемся функцией scatter, наносящая множество точек на плоскость. Параметр color отвечает за цвет точек, а label — за надпись, которая будет отображена в легенде. Функция legend() инициализируем саму легенду, которую с помощью параметра loc мы помещаем в левый верхний угол.

Получаем нечто такое:

И действительно, метки довольно равномерно распределены, что говорит о легкости распределения тестовых наборов среди классов.

Нормализация

Нормализация — приведение числовых значений к определённому диапазону.

Зачем это нужно? Множество метрические алгоритмы вычисляют расстояние между двумя точками с помощью эвклидой метрики.

Например, возьмём точки (1, 1) и (100, 1). Расстояние между ними будет:(

(100 — 1)^2 + (1 — 1)^2)^0.5

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

Сначала воспользуемся линейной нормализацией. Формула такова:

, где Xik — текущий элемент числового набора,

Xmin — минимальный элемент набора,

Xmax — максимальный элемент.

Для упрощения работы найдём список названий столбцов, воспользовавшись полем DataFrame.columns.values.

Возвращаясь к нашему набору, создадим новый объект DataFrame с помощью линейной нормализации:

Здесь из неизвестного только метод массива NumPy(именно в нём хранятся названия столбцов) aray.tolist(), который возвращает список значений, хранящиеся в этом массиве.

Следующий вид нормализации — нелинейная. Формула выглядит так:

, где Xc — среднее арифметическое между максимальным и минимальным значениями набора. Параметр а влияет на нелинейность.

Основная трудность реализации этой нормализации — приведение e в степень значений, находящихся в массиве, получив при этом новый массив. Можно было воспользоваться listcomp и оператором **, однако библиотека NumPy на этот счет имеет свою функцию.

Передав в функцию NumPy.exp массив, мы получим новый массив, который нам и нужен.

Новый диапазон значений первого столбца:

Заключение

Сегодня мы рассмотрели базовые функции объектов DataFrame и Series, небольшой анализ данных и два вида нормализации. Надеемся, что полученные знания пригодятся вам в дальнейшем.

Анализ данных — очень обширная тема, и даже про основы есть еще много чего сказать. Тут и обработка пропущенных значений, и категориальные признаки, и многое другое, о чем мы вам обязательно расскажем.

Весь код из статьи модно найти тут.

Также рекомендую прочитать статью Базовые алгоритмы с помощью Python и подписывайтесь на мой Telegram-канал. Там еще больше полезных и интересных материалов для разработчиков

10 лайфхаков для работы с библиотекой Pandas

Pandas — широко распространённая Python-библиотека для работы со структурированными данными. По её использованию уже составлено большое количество уроков, однако, я хотел бы рассказать о нескольких небольших хитростях, которые могут оказаться полезными.

read_csv

Эта команда вам хорошо знакома. Если данные, которые вы пытаетесь считать, слишком большие, то попробуйте добавить этот аргумент: nrows = 5, чтобы считать только часть таблицы, прежде чем загрузить её полностью. Это поможет избежать ошибок при неправильном выборе разделителя (данные не всегда разделяются при помощи запятых).

(В Linux можно использовать команду head, чтобы просмотреть, например, первые 5 строчек любого текстового файла: head -c 5 data.txt).

Также, можно извлечь список всех колонок при помощи команды df.columns.tolist() . Если добавить аргумент usecols = [‘c1’, ‘c2’, …], то вы получите список только тех колонок, которые вы выберете сами. Чтобы команда выполнилась быстрее и если вы знаете тип данных каждой колонки, можно добавить в качестве аргумента dtype = . Одно из преимуществ этого аргумента — если у вас есть колонка, в которой чередуются строки и числа, можно определить тип всех данных как строковый, чтобы в дальнейшем не возникало ошибок.

select_dtypes

Эта команда позволит сохранить время при проведении предварительной обработки данных в Python. После считывания таблицы для каждой колонки будет определён тип данных: bool, int64, float64, object, category, timedelta64, datetime64. Их распределение можно узнать, используя df.dtypes.value_counts() . Затем, если вам нужно выбрать только численную часть данных, используйте df.select_dtypes(include=[‘float64’, ‘int64’]) .

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

После его выполнения вы увидите, что df1 изменился. Так происходит, потому что df2 = df1 не создаёт копию df1, значение которой присваивается df2, а делает df2 указателем на ту же ячейку памяти, что и df1. То есть, любое изменение df2 отразится и на df1. Чтобы создать копию датафрейма, используйте эту команду:

Это полезная команда для преобразования данных. Для начала нужно объявить словарь, в котором ключами являются старые значения в колонках, а значениями — то, на что планируется их заменить.

Пример: замена True и False на 1 и 0, обозначение уровней, определённая пользователем лексическая кодировка.

apply: использовать или нет?

Если мы хотим создать новую колонку на основе уже существующих, функция apply бывает очень полезной.

В коде выше мы объявляем функцию с двумя входными значениями и применяем её для колонок c1 и c2, создавая новую колонку из результатов.

Проблема в том, что иногда apply слишком медленный. Скажем, вы хотите создать колонку из максимумов c1 и c2, тогда вы заметите, что df[‘maximum’] = df.apply(lambda x: max(x[‘c1’], x[‘c2’]), axis = 1) гораздо медленнее, чем df[‘maximum’] = df[[‘c1’,’c2′]].max(axis =1).

Вывод: не используйте apply, если задачу можно выполнить при помощи других существующих встроенных функций (они работают быстрее). Например, если нужно округлить значения колонки c1, используйте round(df[‘c’], 0) вместо apply.

value_counts

Эта команда проверяет распределение значений. Чтобы узнать, допустим, список всех значений колонки “С” и их частоту, можно использовать команду df[‘c’].value_counts() .

У этой команды есть несколько полезных аргументов:

  • normalize = True: если нужно получить частоту появления значения, а не количество
  • dropna = False: при подсчёте будут учитываться и пропущенные значения
  • sort = False: выводит статистику, отсортированную по количеству появления значения

Также, используйте df[‘c].value_counts().reset_index() , если вы хотите преобразовать таблицу со статистикой в датафрейм для выполнения каких-либо операций над ним в будущем.

Количество пропущенных значений

При построении модели, скорее всего, вы хотели бы просто пропустить строки с большим количеством пропущенных значений. Для подсчёта количества пропущенных значений можно использовать .isnull() и .sum() .

Выбор строк по параметру

В SQL это можно сделать при помощи конструкции SELECT … FROM … WHERE … (например, SELECT * FROM … WHERE ID in (‘A001’, ‘C022’, …) выберет часть датафрейма, в котором ID равен одному из указанных значений. В pandas то же самое можно сделать вот так:

Группировка по процентному соотношению

У вас есть колонка с численными значениями и вы хотели бы разделить эти значения по группам: скажем, 1 группа — наибольшие 5%, 5%–20% во второй группе, 20%-50% — 3 группа, остальное — 4 группа. Конечно, это можно сделать, используя pandas.cut, но я хочу предложить другой вариант:

Он хорош тем, что он довольно быстрый, так как не требует функции apply.

to_csv

Ещё одна команда, с которой вы хорошо знакомы, но, вероятно, не знакомы с двумя хитростями.

  1. Команда print(df[:5].to_csv()) выводит первые 5 строк файла точно в таком же формате, в котором они будут записаны в файл.
  2. Наверняка, вы сталкивались со случаем, когда колонка содержала и пропущенные значения, и целые числа. Тогда типом данных этой колонки будет float, а не int. При экспорте таблицы можно добавить float_format = ‘%.0f’ для того, чтобы округлить все дробные числа до целых. Это пригодится, если вы хотите установить во всех колонках только целые значения.

Введение в pandas: анализ данных на Python

pandas это высокоуровневая Python библиотека для анализа данных. Почему я её называю высокоуровневой, потому что построена она поверх более низкоуровневой библиотеки NumPy (написана на Си), что является большим плюсом в производительности. В экосистеме Python, pandas является наиболее продвинутой и быстроразвивающейся библиотекой для обработки и анализа данных. В своей работе мне приходится пользоваться ею практически каждый день, поэтому я пишу эту краткую заметку для того, чтобы в будущем ссылаться к ней, если вдруг что-то забуду. Также надеюсь, что читателям блога заметка поможет в решении их собственных задач с помощью pandas, и послужит небольшим введением в возможности этой библиотеки.

DataFrame и Series

Чтобы эффективно работать с pandas, необходимо освоить самые главные структуры данных библиотеки: DataFrame и Series. Без понимания что они из себя представляют, невозможно в дальнейшем проводить качественный анализ.

Series

Структура/объект Series представляет из себя объект, похожий на одномерный массив (питоновский список, например), но отличительной его чертой является наличие ассоциированных меток, т.н. индексов, вдоль каждого элемента из списка. Такая особенность превращает его в ассоциативный массив или словарь в Python.

В строковом представлении объекта Series, индекс находится слева, а сам элемент справа. Если индекс явно не задан, то pandas автоматически создаёт RangeIndex от 0 до N-1, где N общее количество элементов. Также стоит обратить, что у Series есть тип хранимых элементов, в нашем случае это int64, т.к. мы передали целочисленные значения.

У объекта Series есть атрибуты через которые можно получить список элементов и индексы, это values и index соответственно.

Доступ к элементам объекта Series возможны по их индексу (вспоминается аналогия со словарем и доступом по ключу).

Индексы можно задавать явно:

Делать выборку по нескольким индексам и осуществлять групповое присваивание:

Фильтровать Series как душе заблагорассудится, а также применять математические операции и многое другое:

Если Series напоминает нам словарь, где ключом является индекс, а значением сам элемент, то можно сделать так:

У объекта Series и его индекса есть атрибут name, задающий имя объекту и индексу соответственно.

Индекс можно поменять «на лету», присвоив список атрибуту index объекта Series

Имейте в виду, что список с индексами по длине должен совпадать с количеством элементов в Series.

DataFrame

Объект DataFrame лучше всего представлять себе в виде обычной таблицы и это правильно, ведь DataFrame является табличной структурой данных. В любой таблице всегда присутствуют строки и столбцы. Столбцами в объекте DataFrame выступают объекты Series, строки которых являются их непосредственными элементами.

DataFrame проще всего сконструировать на примере питоновского словаря:

Чтобы убедиться, что столбец в DataFrame это Series, извлекаем любой:

Объект DataFrame имеет 2 индекса: по строкам и по столбцам. Если индекс по строкам явно не задан (например, колонка по которой нужно их строить), то pandas задаёт целочисленный индекс RangeIndex от 0 до N-1, где N это количество строк в таблице.

В таблице у нас 4 элемента от 0 до 3.

Доступ по индексу в DataFrame

Индекс по строкам можно задать разными способами, например, при формировании самого объекта DataFrame или «на лету»:


Как видно, индексу было задано имя — Country Code. Отмечу, что объекты Series из DataFrame будут иметь те же индексы, что и объект DataFrame:

Доступ к строкам по индексу возможен несколькими способами:

  • .loc — используется для доступа по строковой метке
  • .iloc — используется для доступа по числовому значению (начиная от 0)

Можно делать выборку по индексу и интересующим колонкам:

Как можно заметить, .loc в квадратных скобках принимает 2 аргумента: интересующий индекс, в том числе поддерживается слайсинг и колонки.

Фильтровать DataFrame с помощью т.н. булевых массивов:

Кстати, к столбцам можно обращаться, используя атрибут или нотацию словарей Python, т.е. df.population и df[‘population’] это одно и то же.

Сбросить индексы можно вот так:

pandas при операциях над DataFrame, возвращает новый объект DataFrame.

Добавим новый столбец, в котором население (в миллионах) поделим на площадь страны, получив тем самым плотность:

Не нравится новый столбец? Не проблема, удалим его:

Особо ленивые могут просто написать del df[‘density’].

Переименовывать столбцы нужно через метод rename:

В этом примере перед тем как переименовать столбец Country Code, убедитесь, что с него сброшен индекс, иначе не будет никакого эффекта.

Чтение и запись данных

pandas поддерживает все самые популярные форматы хранения данных: csv, excel, sql, буфер обмена, html и многое другое:

Чаще всего приходится работать с csv-файлами. Например, чтобы сохранить наш DataFrame со странами, достаточно написать:

Функции to_csv ещё передаются различные аргументы (например, символ разделителя между колонками) о которых подробнее можно узнать в официальной документации.

Считать данные из csv-файла и превратить в DataFrame можно функцией read_csv.

Аргумент sep указывает разделитесь столбцов. Существует ещё масса способов сформировать DataFrame из различных источников, но наиболее часто используют CSV, Excel и SQL. Например, с помощью функции read_sql, pandas может выполнить SQL запрос и на основе ответа от базы данных сформировать необходимый DataFrame. За более подробной информацией стоит обратиться к официальной документации.

Группировка и агрегирование в pandas

Группировка данных один из самых часто используемых методов при анализе данных. В pandas за группировку отвечает метод .groupby. Я долго думал какой пример будет наиболее наглядным, чтобы продемонстрировать группировку, решил взять стандартный набор данных (dataset), использующийся во всех курсах про анализ данных — данные о пассажирах Титаника. Скачать CSV файл можно тут.

Необходимо подсчитать, сколько женщин и мужчин выжило, а сколько нет. В этом нам поможет метод .groupby.

А теперь проанализируем в разрезе класса кабины:

Сводные таблицы в pandas

Термин «сводная таблица» хорошо известен тем, кто не по наслышке знаком с инструментом Microsoft Excel или любым иным, предназначенным для обработки и анализа данных. В pandas сводные таблицы строятся через метод .pivot_table. За основу возьмём всё тот же пример с Титаником. Например, перед нами стоит задача посчитать сколько всего женщин и мужчин было в конкретном классе корабля:

В качестве индекса теперь у нас будет пол человека, колонками станут значения из PClass, функцией агрегирования будет count (подсчёт количества записей) по колонке Name.

Всё очень просто.

Анализ временных рядов

В pandas очень удобно анализировать временные ряды. В качестве показательного примера я буду использовать цену на акции корпорации Apple за 5 лет по дням. Файл с данными можно скачать тут.

Здесь мы формируем DataFrame с DatetimeIndex по колонке Date и сортируем новый индекс в правильном порядке для работы с выборками. Если колонка имеет формат даты и времени отличный от ISO8601, то для правильного перевода строки в нужный тип, можно использовать метод pandas.to_datetime.

Мастер Йода рекомендует:  QA engineer, с чего начать

Давайте теперь узнаем среднюю цену акции (mean) на закрытии (Close):

А если взять промежуток с февраля 2012 по февраль 2015 и посчитать среднее:

А что если нам нужно узнать среднюю цену закрытия по неделям?!

Resampling мощный инструмент при работе с временными рядами (time series), помогающий переформировать выборку так, как удобно вам. Метод resample первым аргументом принимает строку rule. Все доступные значения можно найти в документации.

Визуализация данных в pandas

Для визуального анализа данных, pandas использует библиотеку matplotlib. Продемонстрирую простейший способ визуализации в pandas на примере с акциями Apple.

Берём цену закрытия в промежутке между 2012 и 2020.

И видим вот такую картину:

По оси X, если не задано явно, всегда будет индекс. По оси Y в нашем случае цена закрытия. Если внимательно посмотреть, то в 2014 году цена на акцию резко упала, это событие было связано с тем, что Apple проводила сплит 7 к 1. Так мало кода и уже более-менее наглядный анализ 😉

Эта заметка демонстрирует лишь малую часть возможностей pandas. Со своей стороны я постараюсь по мере своих сил обновлять и дополнять её.

Python 3 Pandas: Объекты Series и DataFrame. Построение Index

Опубликовано Шамаев Иван в 23.04.2020 23.04.2020

На самом примитивном уровне объекты библиотеки Pandas можно считать расширенной версией структурированных массивов библиотеки NumPy, в которых строки и столбцы идентифицируются метками, а не простыми числовыми индексами. Библиотека Pandas предоставляет множество полезных утилит, методов и функциональности в дополнение к базовым структурам данных, но все последующее изложение потребует понимания этих базовых структур. Позвольте познакомить вас с тремя фундаментальными структурами данных библиотеки Pandas: классами Series, DataFrame и Index.

Начнем наш сеанс программирования с обычных импортов библиотек NumPy и Pandas:

Объект Series библиотеки Pandas

Объект Series библиотеки Pandas — одномерный массив индексированных данных. Его можно создать из списка или массива следующим образом:

Результат:

Как мы видели из предыдущего результата, объект Series служит адаптером как для последовательности значений, так и последовательности индексов, к которым можно получить доступ посредством атрибутов values и index. Атрибут values представляет собой массив NumPy:

Результат:

Index — массивоподобный объект типа pd.Index:

Результат:

Аналогично массивам библиотеки NumPy, к данным можно обращаться по соответствующему им индексу посредством нотации с использованием квадратных скобок языка Python:

Результат:

Однако объект Series библиотеки Pandas намного универсальнее и гибче, чем эмулируемый им одномерный массив библиотеки NumPy.

Объект Series как обобщенный массив NumPy

Может показаться, что объект Series и одномерный массив библиотеки NumPy взаимозаменяемы. Основное различие между ними — индекс. В то время как индекс массива NumPy, используемый для доступа к значениям, — целочисленный и описывается неявно, индекс объекта Series библиотеки Pandas описывается явно и связывается со значениями.

Явное описание индекса расширяет возможности объекта Series. Такой индекс не должен быть целым числом, а может состоять из значений любого нужного типа. Например, при желании мы можем использовать в качестве индекса строковые значения:

Результат:

При этом доступ к элементам работает обычным образом:

Результат:

Объект Series как специализированный словарь

Объект Series библиотеки Pandas можно рассматривать как специализированную разновидность словаря языка Python. Словарь — структура, задающая соответствие произвольных ключей набору произвольных значений, а объект Series — структура, задающая соответствие типизированных ключей набору типизированных значений.

Типизация важна: точно так же, как соответствующий типу специализированный код для массива библиотеки NumPy при выполнении определенных операций делает его эффективнее, чем стандартный список Python, информация о типе в объекте Series библиотеки Pandas делает его намного более эффективным для определенных операций, чем словари Python.

Можно сделать аналогию «объект Series — словарь» еще более наглядной, сконструировав объект Series непосредственно из словаря Python.

По умолчанию при этом будет создан объект Series с полученным из отсортированных ключей индексом. Следовательно, для него возможен обычный доступ к элементам, такой же, как для словаря. Объект Series поддерживает операции «срезы».

Результат:

Создание объектов Series

Мы уже изучили несколько способов создания объектов Series библиотеки Pandas с нуля.

Все они представляют собой различные варианты следующего синтаксиса Pandas Series (общий вид синтаксиса):

где index — необязательный аргумент, а data может быть одной из множества сущностей.

Например, аргумент data может быть списком или массивом NumPy. В этом случае index по умолчанию будет целочисленной последовательностью:

Результат:

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

Результат:

Аргумент data может быть словарем, в котором index по умолчанию является отсортированными ключами этого словаря:

Результат:

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

Результат:

Обратите внимание, что объект Series заполняется только заданными явным образом ключами.

Объект DataFrame библиотеки Pandas

Следующая базовая структура библиотеки Pandas — объект DataFrame. Как и объект Series, объект DataFrame можно рассматривать или как обобщение массива NumPy, или как специализированную версию словаря Python. Изучим оба варианта.

DataFrame как обобщенный массив NumPy

Если объект Series — аналог одномерного массива с гибкими индексами, объект DataFrame — аналог двумерного массива с гибкими индексами строк и гибкими именами столбцов. Аналогично тому, что двумерный массив можно рассматривать как упорядоченную последовательность выровненных столбцов, объект DataFrame можно рассматривать как упорядоченную последовательность выровненных объектов Series. Под «выровненными» имеется в виду то, что они используют один и тот же индекс.

Чтобы продемонстрировать это, сначала создадим новый объект Series, содержащий площадь каждого из пяти упомянутых в предыдущем разделе штатов:

Результат:

Воспользовавшись объектом population класса Series, сконструируем на основе словаря единый двумерный объект, содержащий всю эту информацию:

Результат:

Аналогично объекту Series у объекта DataFrame имеется атрибут index, обеспечивающий доступ к меткам индекса. Еще у объекта DataFrame есть атрибут columns, представляющий собой содержащий метки столбцов объект Index.

Результат:

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

Объект DataFrame как специализированный словарь

DataFrame можно рассматривать как специализированный словарь. Если словарь задает соответствие ключей значениям, то DataFrame задает соответствие имени столбца объекту Series с данными этого столбца. Например, запрос данных по атрибуту ‘area’ приведет к тому, что будет возвращен объект Series, содержащий площади штатов:

Результат:

Создание объектов DataFrame

Существует множество способов создания объектов DataFrame библиотеки Pandas. Вот несколько примеров.

Из одного объекта Series

Объект DataFrame — набор объектов Series.

DataFrame, состоящий из одного столбца, можно создать на основе одного объекта Series:

Результат:

Из списка словарей

Любой список словарей можно преобразовать в объект DataFrame. Мы воспользуемся простым списковым включением для создания данных:

Результат:

Даже если некоторые ключи в словаре отсутствуют, библиотека Pandas просто заполнит их значениями NaN (то есть Not a number — «не является числом»):

Результат:

Из словаря объектов Series

Объект DataFrame также можно создать на основе словаря объектов Series (этот пример был приведен ранее):

Результат:

Из двумерного массива NumPy

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

Результат:

Из структурированного массива NumPy

Объект DataFrame библиотеки Pandas ведет себя во многом аналогично структурированному массиву библиотеки NumPy и может быть создан непосредственно из него:

Результат:

Объект Index библиотеки Pandas

Как объект Series, так и объект DataFrame содержат явный индекс, обеспечивающий возможность ссылаться на данные и модифицировать их.

Объект Index можно рассматривать или как неизменяемый массив (immutable array), или как упорядоченное множество (ordered set) (формально мультимножество, так как объекты Index могут содержать повторяющиеся значения). Из этих способов его представления следуют некоторые интересные возможности операций над объектами Index. В качестве простого примера создадим Index из списка целых чисел:

Результат:

Объект Index как неизменяемый массив

Объект Index во многом ведет себя аналогично массиву. Например, для извлечения из него значений или срезов можно использовать стандартную нотацию индексации языка Python. У объектов Index есть много атрибутов.

Результат:

Одно из различий между объектами Index и массивами NumPy — неизменяемость индексов, то есть их нельзя модифицировать стандартными средствами:

Результат:

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

Выбор подмножеств данных в Pandas

Анатомия Python Pandas DataFrame — Column, Index, Data

Рассмотрим изображение контейнера данных DataFrame (библиотеки Pandas):

Три компонента DataFrame:

DataFrame состоит из трех различных компонентов: индекса , столбцов и данных. Данные также известны как значения.

Индекс — это последовательность значений в левой части DataFrame. Каждое отдельное значение индекса называется index label, Иногда индекс упоминается как заголовки строк. В приведенном выше примере метки строк не очень интересны и представляют собой целые числа, начиная с 0 до n-1, где n — количество строк в таблице.

Столбцы представляют собой последовательность значений в самой верхней части DataFrame.


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

Каждая строка имеет метку, каждая колонка имеет метку

Основной вывод из анатомии DataFrame заключается в том, что каждая строка имеет метку, каждый столбец имеет метку. Эти метки используются для ссылки на конкретные строки или столбцы в DataFrame.

Что такое выбор подмножества?

Прежде чем мы начнем делать выбор подмножества, было бы хорошо определить, что это такое. Выбор подмножества — это просто выбор определенных строк и столбцов данных из DataFrame (или Series). Это может означать выбор всех строк и некоторых столбцов, некоторых строк и всех столбцов или некоторых строк и столбцов.

Выбор при помощи []

Загружаем данные из CSV в Pandas DataFrame (Python 3)

В совокупности [], .loc и .iloc называются индексаторами. Это самые распространенные способы выбора данных.

Скачать файл для использования в примерах:

Код загрузки данных из csv в Pandas DataFrame:

Результат:

Вариант 2 загрузки данных из CSV (Index генерируется самостоятельно)

Результат:

Извлечение отдельных компонентов DataFrame

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

Результат:

Типы данных компонентов

Давайте выведем тип каждого компонента, чтобы точно понять, что это за объект.

Результат:

Понимание этих типов

Интересно, что и индекс, и столбцы имеют одинаковый тип. Они оба Index- объект Pandas. Этот объект сам по себе довольно мощный, но сейчас вы можете думать о нем как о последовательности меток для строк или столбцов.

Значения (ячейки таблицы) — это numpy.ndarray , который обозначает n-мерный массив и является основным контейнером данных в библиотеке NumPy.

Pandas построен непосредственно поверх NumPy, и именно этот массив отвечает за большую часть рабочей нагрузки.

Выбор одного столбца как серии

Чтобы выбрать один столбец данных, просто поместите имя столбца в скобках. Давайте выберем столбец Подразделение:

Результат:

Анатомия Series, возвращаемой при выборе 1 столбца

Выбор одного столбца данных возвращает другой контейнер данных Pandas Series.

Series — это одномерная последовательность помеченных данных. Существует два основных компонента Серии: указатель и данные (или значения . В серии нет колонок.

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

Вы также заметите две дополнительные части данных в нижней части Series.

Name из Series становится старое имя колонки. Вы также увидите тип данных или dtype серии. Вы можете игнорировать оба этих элемента на данный момент. А также количество элементов Length.

Выбор нескольких столбцов с помощью оператора индексации

Можно выбрать несколько столбцов только с помощью оператора индексации, передав ему список имен столбцов. Давайте выберем ‘Подразделение’, ‘Менеджер’, ‘Номенклатура’, ‘Продажи’

Результат:

Выбор нескольких столбцов возвращает DataFrame

Выбор нескольких столбцов возвращает DataFrame. На самом деле вы можете выбрать один столбец как DataFrame со списком из одного элемента:

Результат:

Хотя это напоминает Series, технически это DataFrame, другой объект.

Порядок столбцов не имеет значения

При выборе нескольких столбцов вы можете выбрать их в любом порядке по вашему выбору. Это не должен быть тот же самый порядок как оригинальный DataFrame.

Например, давайте выберем Номенклатура, Подразделение:

Результат:

Исключения, при выполнении скрипта

Есть несколько общих исключений, которые возникают при выполнении выборок только с помощью оператора индексации.

  • Если вы ошиблись словом, вы получите KeyError
  • Если вы забыли использовать список, содержащий несколько столбцов, вы также получите KeyError

В первом случае должно стоять print(df[‘Подразделение’]) . А во-втором случае: print(df[[‘Номенклатура’,’Подразделение’]]) .

Выборка данных из Pandas DataFrame с помощью .loc

В .loc индексатор выбирает данные по-другому, чем просто оператор индексации. Он может выбирать подмножества строк и/или столбцов. Самое главное, он выбирает данные только по метке (label) строк и столбцов.

Выберем одну строку как Series с .loc

.loc Индексатор возвращает одну строку в серии , когда дали одну метку строки.

Как выбрать строки из Pandas DataFrame по условию

Собираем тестовый набор данных для иллюстрации работы выборки по условию

Color Shape Price
Green Rectangle 10
Green Rectangle 15
Green Square 5
Blue Rectangle 5
Blue Square 10
Red Square 15
Red Square 15
Red Rectangle 5

Пишем скрипт:

Синтаксис выборки строк из Pandas DataFrame по условию

Вы можете использовать следующую логику для выбора строк в Pandas DataFrame по условию:

Например, если вы хотите получить строки с зеленым цветом , вам нужно применить:

  • Color — это название столбца
  • Green — это условие (значение колонки)

А вот полный код Python для нашего примера:

Результат:

Выберем строки, где цена равна или больше 10

Чтобы получить все строки, где цена равна или больше 10, Вам нужно применить следующее условие:

Полный код Python:

Результат:

Выберем строки, в которых цвет зеленый, а форма — прямоугольник

Теперь цель состоит в том, чтобы выбрать строки на основе двух условий:

  • Color зеленый; а также
  • Shape = прямоугольник

Мы будем использовать символ & для применения нескольких условий. В нашем примере код будет выглядеть так:

Полный код примера Python для выборки Pandas DataFrame:

Результат:

Выберем строки, где цвет зеленый ИЛИ форма прямоугольная

Для достижения этой цели будем использовать символ | следующим образом:

Полный код Python 3:

Выберем строки, где цена не равна 15

Мы будем использовать комбинацию символов !=, чтобы выбрать строки, цена которых не равна 15:

Полный код Pandas DF на питоне:

Результат работы скрипта Python:

10 трюков Python Pandas, которые сделают вашу работу более эффективной

Pandas — это широко используемый пакет Python для структурированных данных.

read_csv

Все знают эту команду. Но данные, которые вы пытаетесь прочитать, велики, попробуйте добавить этот аргумент: nrows = 5, чтобы загружать только часть данных. Тогда вы можете избежать ошибки, выбрав неправильный разделитель (он не всегда может быть разделен запятой).

(Или вы можете использовать команду ‘head’ в linux, чтобы проверить первые 5 строк (скажем) в любом текстовом файле: head -n 5 data.txt )

Затем вы можете извлечь список столбцов, используя df.columns.tolist() для извлечения всех столбцов, а затем добавить аргумент usecols = [‘c1’, ‘c2’,…], чтобы загрузить нужные вам столбцы.

Кроме того, если вы знаете типы данных нескольких определенных столбцов, вы можете добавить аргумент dtype = <‘c1’: str, ‘c2’: int,…>, чтобы он загружался быстрее.

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

select_dtypes

Если предварительная обработка данных должна выполняться в Python, эта команда сэкономит вам время. После чтения в таблице типами данных по-умолчанию для каждого столбца могут быть bool, int64, float64, object, category, timedelta64 или datetime64. Вы можете сначала проверить распределение по

чтобы узнать все возможные типы данных вашего DataFrame

выбрать sub-dataframe только с числовыми характеристиками.

Это важная команда, если вы еще не слышали о ней. Если вы выполните следующие команды:

Вы обнаружите, что df1 изменен. Это потому, что df2 = df1 не делает копию df1 и присваивает ее df2, но устанавливает указатель, указывающий на df1. Таким образом, любые изменения в df2 приведут к изменениям в df1. Чтобы это исправить, вы можете сделать либо

Это классная команда для простого преобразования данных. Сначала вы определяете словарь, в котором «ключами» являются старые значения, а «значениями» являются новые значения.

Некоторые примеры:

True, False до 1, 0 (для моделирования); определение уровней; определяемые пользователем лексические кодировки.

apply or not apply?

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

В приведенных выше кодах мы определяем функцию с двумя входными переменными и используем функцию apply, чтобы применить ее к столбцам ‘c1’ и ‘c2’.

Но проблема «apply» в том , что иногда он слишком медленный . Скажем, если вы хотите вычислить максимум из двух столбцов «c1» и «c2», конечно, вы можете сделать

но вы найдете это намного медленнее, чем эта команда:

Вывод : не используйте apply, если вы можете выполнить ту же работу с другими встроенными функциями (они часто быстрее). Например, если вы хотите округлить колонку «с» целыми числами, делать

Вместо использования функции применяются:

value counts

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

Есть несколько полезных трюков / аргументов:

  1. normalize = True : если вы хотите проверить частоту вместо количества.
  2. dropna = False : если вы также хотите включить пропущенные значения в статистику.
  3. df[‘c’].value_counts().reset_index() .: если вы хотите преобразовать таблицу статистики в кадр данных pandas и манипулировать ею
  4. df[‘c’].value_counts().sort_index() : показать статистику, отсортированную по разным значениям, в столбце «c» вместо счетчиков.

number of missing values — количество пустых значений

При построении моделей может потребоваться исключить строку со слишком большим количеством пропущенных значений / строки со всеми пропущенными значениями. Вы можете использовать .isnull() и .sum() для подсчета количества пропущенных значений в указанных столбцах.

выбрать строки с конкретными идентификаторами (select rows with specific IDs)

В SQL мы можем сделать это, используя SELECT * FROM … WHERE ID in (‘A001’, ‘C022’, …), чтобы получить записи с конкретными идентификаторами. Если вы хотите сделать то же самое с Pandas, вы можете сделать

Процентильные группы (Percentile groups)

У вас есть числовой столбец, и вы хотите классифицировать значения в этом столбце по группам, скажем, верхние 5% в группе 1, 5–20% в группе 2, 20–50% в группе 3, нижние 50% в группе 4 Конечно, вы можете сделать это с помощью pandas.cut, но я бы хотел предоставить здесь другую опцию:

который быстро запускается (не применяется функция apply).

to_csv

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

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

Мастер Йода рекомендует:  15 интересных CSS и JavaScript библиотек на апрель 2020

Еще один трюк — это смешанные целые числа и пропущенные значения. Если столбец содержит как пропущенные значения, так и целые числа, тип данных по-прежнему будет плавающим, а не целым. Когда вы экспортируете таблицу, вы можете добавить float_format=‘%.0f’ , чтобы округлить все числа с плавающей точкой до целых чисел. Используйте этот трюк, если вам нужны только целочисленные выходные данные для всех столбцов — вы избавитесь от всех назойливых ‘.0’s.

20 библиотек для Python разработчиков

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

1. Requests. Самая известная HTTP библиотека, написанная Кеннетом Ритц. Должна быть в арсенале любого разработчика Python.

2. Scrapy. Если вы участвуете в очистке сети, то данная библиотека вам очень пригодится. Поработав с данной библиотекой, остальные вам уже не понадобятся.

3. wxPython. Графический пользовательский интерфейс для Python. Может быть использован вместо Tkinter. Вам он понравится.

4. Pillow. Дружеская форма PIL (Python Imaging Library). Она более удобна для пользователей, чем PIL и просто необходима тем, кто работает с картинками.

5. SQLAlchemy. Библиотека с базой данных. Многие ее любят и многие ненавидят. Выбор стоит за вами.

6. BeautifulSoup. Несмотря на свою медлительность, эта XML и HTML библиотека может быть очень полезна для начинающих.

7. Twisted. Самый важный инструмент для любого разработчика сетевых приложений. Он имеет очень красивый интерфейс API и используется многими известными разработчиками Python.

8. NumPy. Как возможно забыть про эту важную библиотеку? Она предоставляет некоторые продвинутые математические функциональности для Python.

9. SciPy. Когда речь идет о NumPy, тогда мы вспоминаем о SciPy. Данная библиотека алгоритмов и математических инструментов для Python заставила многих ученых перейти с Ruby на Python.


10. matplotlib. Данная библиотека очень полезна для любого ученого, работающего с данными или любого дата-аналитика.

11. Pygame. Какой разработчик не любит играть в игры и колдовать над ними? Эта библиотека поможет вам достичь вашей цели в развитии 2d игры.

12. Pyglet. 3d анимация и создание игрового движка. С помощью него был сделан знаменитый порт Minecraft.

13. pyQT. Графический инструментарий для Python. Советуем его как второй выбор после WxPython для разработки GUI сценариев.

14. pyGtk. Очередная Python GUI библиотека. Это та самая библиотека, в которой создается знаменитый Bittorrent клиент.

15. Scapy. Анализатор пакетов для Python, сделанный при использовании Python.

16. pywin32. Библиотека для Питона, которая предоставляет некоторые полезные методы и классы для взаимодействия с Windows

17. nltk. Natural Language Toolkit. Очевидно, что большинство людей данный инструмент не используют, но данная библиотека достаточно обширна. Довольно полезная библиотека, если вы хотите работать со строками. Однако ее возможности гораздо обширней. Проверьте сами.

18. nose. Среда тестирования для Python. Она используется миллионами разработчиков Python и просто необходима тем, кто осуществляет пробные тестирования при программировании.

19. SymPy. SymPy может сделать алгебраическую оценку, дифференцировку, расширение, комплексные числа и т.д.

20. IPython. Не хватит слов, чтобы передать насколько полезен этот инструмент. Он может послужить заменой и расширить возможности стандартной командной оболочки операционной системы, особенно на Windows, и многое другое. Ни в коем случае не пропустите его.

Надеемся, данный пост оказался вам полезен. Если вы считаете, что какая-то важная библиотека Python была пропущена, пожалуйста, упомяните ее в комментариях, и мы обязательно включим ее в данную статью.

12 лучших Python-библиотек для Data Science

В последние годы Python стал востребованным в области Data Science. Это стало возможным благодаря появлению библиотек, способных обрабатывать и визуализировать большие данные на уровне MATLAB, Mathematica и R. Далее поговорим о 15 лучших.

NumPy

Python SciPy Stack — набор библиотек, специально предназначенных для научных вычислений. Каждый, кто собрался использовать Python в науке, должен познакомиться с этим стеком.
Самый фундаментальный пакет — NumPy. Он позволяет выполнять основные операции над n-массивами и матрицами: сложение вычитание, деление, умножение, транспонирование, вычисление определителя и т. д. Благодаря механизму векторизации, NumPy повышает производительность и, соответственно, ускоряет выполнение операций.

SciPy

SciPy — библиотека в составе Python SciPy Stack, не запутайтесь. Она содержит модули для линейной алгебры, оптимизации, интеграции и статистики. SciPy работает совместно с NumPy, что позволяет ей значительно расширить функциональность. Два аргумента, почему эта библиотека действительно хороша:

  1. Наличие подпрограмм, таких как численная интеграция и оптимизация, для повышения производительности.
  2. Подробная документация на каждую функцию.

Pandas

Pandas — это пакет, предназначенный для простой и интуитивно понятной работы с «помеченными» и «реляционными» данными. Тоже работает в связке с NumPy, и помимо математических вычислений обеспечивает их агрегацию и визуализацию.

Matplotlib

Переходим к визуализации, и на очереди ещё одна библиотека из пакета SciPy Stack. Именно возможности Matplotlib позволяют рассматривать Python, как полноправного конкурента MATLAB или Mathematica. С её помощью вы создадите:

  • Линейные графики;
  • Графики рассеяния;
  • Гистограммы;
  • Круговые диаграммы;
  • Стволовые участки;
  • Контурные участки;
  • Участки колчана;
  • Спектрограммы.

Библиотека низкоуровневая, что означает большой объём кода для расширенной визуализации. Но производительность и работа с привычным языком позволяют закрыть глаза на этот недостаток.
Matplotlib является основным инструментом для визуализации данных на языке Python, поддерживается различными платформами и IDE (iPython, Jupyter и пр.)

Seaborn

Seaborn базируется на Matplotlib, но оптимизирован для визуализации статистических моделей: тепловые карты, распределения, результаты математических операций. Несмотря на указанные возможности, большинство разработчиков использует библиотеку для отображения простых временных распределений.

Bokeh

В отличие от Seaborn, Bokeh не зависит от Matplotlib. Основная область его применения — веб, где визуализация данных происходит согласно стилю d3. js (Data-Driven Documents). Визуально графики, построенные при помощи Bokeh, выглядят привлекательнее, чем в предыдущих двух случаях.

Plotly

Plotly — онлайн инструмент .для визуализации данных с поддержкой Python, R, MATLAB, Perl, Julia, Arduino и REST. Библиотека содержит шаблоны и заготовки для повышения производительности. Есть один минус — исполнение кода происходит на серверной стороне, после чего изображение готово к публикации в интернете. Впрочем, есть способ это обойти.

SciKit-Learn

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

Theano

Theano — одна из самых мощных библиотек в нашем списке. Вот несколько причин:

  • тесная интеграция с NumPy;
  • использование CPU и GPU для повышения производительности;
  • встроенные механизмы оптимизации кода;
  • расширения для юнит-тестирования и самопроверки.

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

TensorFlow

Библиотека от Google была разработана специально для обучения нейронных сетей. Вы можете прямо сейчас оценить эффективность TensorFlow на примере голосового помощника или в игре «Quick, Draw». Библиотека использует многоуровневую систему узлов для обработки большого количества данных, что расширяет сферу её использования далеко за научную область.

Keras

Keras использует возможности TensorFlow и Theano в качестве компонентов. Минималистичный подход в дизайне и невероятная расширяемость позволяет быстро начать работу с библиотекой, и не менять её для серьёзного моделирования. Keras также используется в построении и обучении нейронных сетей, а также при решении задачи распознавания устной речи.

NLTK расшифровывается как Natural Language Toolkit, что недвусмысленно говорит о назначении библиотеки. Её Преимущественно использует для анализа текстовых документов:

  • тегирования;
  • токенизации;
  • идентификации имен;
  • построения связей между предложениями и частями текста;
  • семантические рассуждения.

Это лишь малая часть Python-библиотек, используемых в Data Science. Некоторые из них приносят общую практическую пользу, другие предлагают оптимизацию под конкретные задачи. Попробуйте их все и выберите для себя лучшие. Только начинаете свой путь в Python? Тогда записывайтесь на наш онлайн-интенсив по основам языка Питон.

Не забудьте поделиться результатами в комментариях.

В последние годы Python стал востребованным в области Data Science. Это стало возможным благодаря появлению библиотек, способных обрабатывать и визуализировать большие данные на уровне MATLAB, Mathematica и R. Далее поговорим о 15 лучших.

NumPy

Python SciPy Stack — набор библиотек, специально предназначенных для научных вычислений. Каждый, кто собрался использовать Python в науке, должен познакомиться с этим стеком.
Самый фундаментальный пакет — NumPy. Он позволяет выполнять основные операции над n-массивами и матрицами: сложение вычитание, деление, умножение, транспонирование, вычисление определителя и т. д. Благодаря механизму векторизации, NumPy повышает производительность и, соответственно, ускоряет выполнение операций.

SciPy

SciPy — библиотека в составе Python SciPy Stack, не запутайтесь. Она содержит модули для линейной алгебры, оптимизации, интеграции и статистики. SciPy работает совместно с NumPy, что позволяет ей значительно расширить функциональность. Два аргумента, почему эта библиотека действительно хороша:

  1. Наличие подпрограмм, таких как численная интеграция и оптимизация, для повышения производительности.
  2. Подробная документация на каждую функцию.

Pandas

Pandas — это пакет, предназначенный для простой и интуитивно понятной работы с «помеченными» и «реляционными» данными. Тоже работает в связке с NumPy, и помимо математических вычислений обеспечивает их агрегацию и визуализацию.

Matplotlib

Переходим к визуализации, и на очереди ещё одна библиотека из пакета SciPy Stack. Именно возможности Matplotlib позволяют рассматривать Python, как полноправного конкурента MATLAB или Mathematica. С её помощью вы создадите:

  • Линейные графики;
  • Графики рассеяния;
  • Гистограммы;
  • Круговые диаграммы;
  • Стволовые участки;
  • Контурные участки;
  • Участки колчана;
  • Спектрограммы.

Библиотека низкоуровневая, что означает большой объём кода для расширенной визуализации. Но производительность и работа с привычным языком позволяют закрыть глаза на этот недостаток.
Matplotlib является основным инструментом для визуализации данных на языке Python, поддерживается различными платформами и IDE (iPython, Jupyter и пр.)

Seaborn

Seaborn базируется на Matplotlib, но оптимизирован для визуализации статистических моделей: тепловые карты, распределения, результаты математических операций. Несмотря на указанные возможности, большинство разработчиков использует библиотеку для отображения простых временных распределений.

Bokeh

В отличие от Seaborn, Bokeh не зависит от Matplotlib. Основная область его применения — веб, где визуализация данных происходит согласно стилю d3. js (Data-Driven Documents). Визуально графики, построенные при помощи Bokeh, выглядят привлекательнее, чем в предыдущих двух случаях.

Plotly

Plotly — онлайн инструмент .для визуализации данных с поддержкой Python, R, MATLAB, Perl, Julia, Arduino и REST. Библиотека содержит шаблоны и заготовки для повышения производительности. Есть один минус — исполнение кода происходит на серверной стороне, после чего изображение готово к публикации в интернете. Впрочем, есть способ это обойти.

SciKit-Learn

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

Theano

Theano — одна из самых мощных библиотек в нашем списке. Вот несколько причин:

  • тесная интеграция с NumPy;
  • использование CPU и GPU для повышения производительности;
  • встроенные механизмы оптимизации кода;
  • расширения для юнит-тестирования и самопроверки.

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

TensorFlow

Библиотека от Google была разработана специально для обучения нейронных сетей. Вы можете прямо сейчас оценить эффективность TensorFlow на примере голосового помощника или в игре «Quick, Draw». Библиотека использует многоуровневую систему узлов для обработки большого количества данных, что расширяет сферу её использования далеко за научную область.

Keras

Keras использует возможности TensorFlow и Theano в качестве компонентов. Минималистичный подход в дизайне и невероятная расширяемость позволяет быстро начать работу с библиотекой, и не менять её для серьёзного моделирования. Keras также используется в построении и обучении нейронных сетей, а также при решении задачи распознавания устной речи.

NLTK расшифровывается как Natural Language Toolkit, что недвусмысленно говорит о назначении библиотеки. Её Преимущественно использует для анализа текстовых документов:

  • тегирования;
  • токенизации;
  • идентификации имен;
  • построения связей между предложениями и частями текста;
  • семантические рассуждения.

Это лишь малая часть Python-библиотек, используемых в Data Science. Некоторые из них приносят общую практическую пользу, другие предлагают оптимизацию под конкретные задачи. Попробуйте их все и выберите для себя лучшие. Только начинаете свой путь в Python? Тогда записывайтесь на наш онлайн-интенсив по основам языка Питон.

Не забудьте поделиться результатами в комментариях.

Анализ данных с Pandas.Python

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

У нас есть набор данных, который нужно превратить в таблицу. Это делается вызовом конструктора DataFrame() Конструктор принимает два аргумента – список данных и названия столбцов, которые должны быть в таблице. Попробуем :

Вот мы получили аккуратную таблицу с 3-мя колонками и 3-мя рядами (с 0 по 2 индекс). Конечно мы руками не будем забивать все данные . Давайте загрузим из из CSV файла, я подготовил не большую базу для примера на которой мы будем тренироваться. Качаем .

CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Строка таблицы соответствует строке текста, которая содержит одно или несколько полей, разделенных запятыми.

Информация о базе.

Давайте ознакомимся с данными с помощью двух методов : head() и tail() . head(по умолчанию 5) — вернет строки набора данные с начала таблички, tail() — соответственно с хвоста.

У DataFrame есть неотъемлемые свойства, значения которых можно запросить. Атрибут columns содержит информацию о названиях столбцов в наборе данных. Для просмотра типа данных каждого столбца лучше всего использовать атрибут dtypes. object соответствует типу srt. О размерах таблицы с данными сообщает её атрибут shape.

Всю информацию, которую предоставляют разные атрибуты DataFrame, можно получить вызовом одного-единственного метода info().

Работа с данными или индексация.

К каждой ячейке с данными в DataFrame можно обратиться по её индексу и названию столбца. Мы можем получать различные срезы данных в зависимости от того, какой запрос к DataFrame мы сформулируем.

Атрибут loc[строка, столбец] даёт доступ к элементу по строке и столбцу.

  • Одна ячейка — .loc[7, ‘название столбца’]
  • Один столбец — .loc[:, ‘название столбца’]
  • Несколько столбцов — .loc[:, [‘название столбца’, ‘название столбца’]]
  • Несколько столбцов подряд (срез) — .loc[:, ‘login’: ‘pass’]
  • Одна строка — .loc[1]
  • Все строки, начиная с заданной — .loc[1:]
  • Все строки до заданной — .loc[:3]
  • Несколько строк подряд (срез) — .loc[2:5]

Но это не самое интересное, мы можем использовать логическую индексацию. Давайте сделаем выборку все данных где пароль задан 12345 :

[: , ‘pass’] == ‘12345’ ] — логическое условие которое проверяется для каждого элемента столбца ‘pass’ . [ : ] — какой столбец выбираем.

Так же мы можем посчитать количество данных. В Pandas для этого есть метод count() :

Для примера посчитаем долю паролей «12345» в базе данных :

Очистка данных.

Конечно данные не идеальны. Где то пропущены значения, возможно есть дубликаты и т.д. Pandos конечно нам позволяет очистить данные от мусора.

Для начало поменяем название столбцов, воспользуемся методом set_axis() . Он принимает три аргумента:

  • список с новыми названиями столбцов;
  • axis — ось, которой новые названия присваиваются: ‘index’, если они даются строкам, и ‘columns’, если это список новых названий столбцов;
  • inplace — принимает значения True либо False. В первом случае метод set_axis() перестраивает структуру данных так, что она замещает прежнюю в переменной с тем же именем.

Так же в данных бывает что и нет данных ) В нашей таблице есть ячейки без данных .Замены пропущенных значений в DataFrame бывают трёх видов:

  • Ожидаемые: None или NaN. None (англ. none, «ничто») — это эквивалент null в других языках программирования: особое значение, указывающее, что в этой ячейке таблицы никакого значения нет. None относится к NoneType .
  • Странные: плейсхолдеры (тексты-заполнители) какого-нибудь общепринятого стандарта, иногда неизвестного вам, но которого придерживаются составители. Чаще всего это n/a, na, NA (от англ. no answer, «нет ответа»), и N.N.либо NN (от лат. Nomen nescio, «не знаю имени»).
  • Неожиданные: например, разработчики решили, что пустые значения в таблице будут заполняться знаками вопроса или нулями. В лучшем случае этот факт укажут в документации, в худшем – придётся просматривать данные самостоятельно. Если какой-нибудь спецсимвол или число встречаются часто, и этому нет внятного объяснения, то высока вероятность, что так передаются пропущенные значения.

Для поиска первых двух типов в Pandas есть два метода .isnull() и .isna() . Если значение элемента не существует, .isnull() и .inna() возвращает True, а иначе — False. Суммируют эти True вызовом метода sum() который в этом случае возвращает общее число элементов без определённых значений.

Как мы видим у нас есть пропущенные значения в столбце Login и Password. Давайте пропущенные значения в столбце Login заполним нулями . Для этого будем использовать метод .fillna(чем заполнить)

А строки с пропущенными данными в Password удалим методом . dropna()

Заметьте , индексирование таблицы у нас нарушилась : после 8152 идет сразу 8154 . Исправим это методом .reset_index( drop=True ) .

Теперь перейдем к дубликатам. Для поиска дубликатов есть метод . duplicated() . Он возвращает Series со значением True при наличии дубликатов, и False, когда их нет.

Для удаления дубликатов из данных используем метод .drop_duplicates()

Для просмотра всех уникальных значений в столбце используется метод . unique()

Для замены определенных значений можно воспользоваться методом replace() , где первый аргумент — текущее значение, а второй — новое, нужное.

Анализ данных.

Для анализа данных мы возьмем базу найденных экзопланет в формате CSV , качаем.

  • name: название экзопланеты;
  • mass: масса в массах планеты Юпитер;
  • radius: радиус, пересчитанный в радиусах Земли;
  • discovered: год открытия экзопланеты.
  • star_mass : масса в массах Солнца.

Анализ данных начинают с разделения их на группы по какому-нибудь признаку. Эта операция называется группировка данных. Группировка оправданна, если данные чётко делятся по значимому признаку, а полученные группы близки к теме задачи.

В Рandas для группировки данных есть метод .groupby() . Он принимает как аргумент название столбца, по которому нужно группировать. В случае с делением экзопланет по годам открытия:

Применение метода .groupby() к объекту типа DataFrame приводит к созданию объекта особого типа — DataFrameGroupBy. Это сгруппированные данные. Если применить к ним какой-нибудь метод Pandas, они станут новой структурой данных типа DataFrame или Series.

В 2014 и 2020 было открыто очень много планет. Уммм

Если нужно сравнить по одному показателю, метод применяют к DataFrameGroupBy с указанием на один столбец. Например радиус :

Давайте сделаем выборку по планетам радиус которых почти равен земному и отсортируем по убыванию. Для сортировки значений в Pandas есть метод .sort_values( )

  • ‘имя столбца’ — имя столбца, по которому нужно сортировать;
  • ascending: по умолчанию True. Для сортировки по убыванию установите значение False.

Oписательная статистика — четыре основных метода максимум, минимум, медиана и среднее

В статистике медиана делит выборку пополам: в одной половине значения меньше медианного, в другой больше. Логично, что для определения медианы список обязательно должен быть отсортирован — либо по возрастанию, либо по убыванию.

Добавить комментарий