В этом видео мы продолжаем работать с библиотекой Pandas.
Мы узнаем еще несколько полезных функций для работы с data frame,
а также поговорим об индексации и селекции.
Для начала импортируем нашу библиотеку.
Далее снова создаем data frame,
делаем это с помощью уже знакомой нам функции read_csv.
[ЗВУК]
[ЗВУК]
Итак, наш data frame перед вами.
Первое, что хочется сделать — это посмотреть, какого типа наши столбцы.
Это делается с помощью dtypes.
[ЗВУК] Мы видим,
что все столбцы имеют тип object.
Если присмотреться повнимательнее к нашему data frame,
то можно заметить, что столбец Birth соответствует дате рождения,
а в Python есть специальный тип datetime для работы с датами.
Если мы сделаем наш столбец типа datetime, то нам будет удобнее с ним работать,
потому что мы сможем вызывать специфичные для datetime функции.
Это можно сделать с помощью метода apply.
Давайте посмотрим, как он работает.
Сразу скажу, что метод apply тоже работает не inplace,
поэтому воспользуемся уже привычным синтаксисом с присваиванием.
Вызываем метод apply.
Итак, что мы хотим?
Мы хотим применить к нашему столбцу функцию, которая поменяет его тип.
Давайте выберем функцию to_datetime, это также функция модуля от Pandas.
Так, вызываем нашу функцию.
И теперь смотрим, как изменился наш data frame.
Так.
Сначала можем просто вывести его на печать.
Видим, что немножечко изменился формат записи наших дат.
А теперь убедимся, что тип также изменился.
Снова вызываем dtypes и видим, что,
действительно, колонка Birth изменила свой тип — теперь это datetime.
Теперь мы сможем с ней работать, как с датой.
А следующая полезная функция, которую мы изучим — это функция info.
Оно позволяет нам получить мини-сводку по нашему data frame.
Мы видим список всех колонок, которые у нас есть, видим,
сколько там ненулевых объектов.
Вот мы видим, что в колонке Position есть два нулевых значения.
Также мы видим, какие типы данных у нас используются и сколько места тратится на
хранение нашего data frame.
Мы видим, что наш data frame содержит пропущенные значения,
это пропуски в столбце Position, не все должности заполнены.
Нам не всегда удобно работать с пропущенными значениями в том виде,
в котором они есть, и часто мы хотим их на что-то заменить, чем-то их заполнить.
Давайте это сделаем в нашем случае.
Например, предположим, что откуда-то из наших априорных данных мы знаем,
что везде, где позиция пропущена, она соответствует должности «разнорабочий».
Давайте так и заполним.
Для этого мы можем воспользоваться методом fillna.
[ЗВУК] В
качестве аргумента передаем то значение, которым мы хотим заполнить наши пропуски.
Мы с вами просто пишем строчку «разнорабочий», и сразу говорим,
что мы хотим делать это inplace.
Так, запускаем.
Убираем лишнюю букву a и еще раз запускаем.
Так, теперь давайте посмотрим, как выглядит наш data frame после изменений.
На экране появился data frame
без пропусков, теперь все наши пропуски заполнены значением «разнорабочий».
Но на самом деле, в данном случае мы видим,
что наши изменения коснулись только одного столбца.
Часто нам удобнее вывести его отдельно.
Это можно сделать, обратившись к нему по имени через точку.
Например, frame.Position.
Видим, что нам вывелся только один столбец,
причем он вывелся как series, то есть как обычный массив.
Если мы хотим вывести его в виде data frame,
то есть чтобы было видно саму таблицу, то нужно обратиться к нему несколько иначе.
Указываем значения нашего столбца, вернее, его имя,
Position, и видим, что теперь он вывелся в привычной для нас форме в виде таблицы.
На самом деле, аналогичным образом можно вывести любой набор столбцов.
Давайте выведем имя и позицию, Name и Position.
И аналогично можно поступать со строчками.
Допустим, мы хотим вывести первые несколько строк.
Если мы выводим первые строки, то можно воспользоваться командой head.
Допустим, первые три строки.
Есть и альтернативный способ вывода первых трех строк нашего data frame.
Мы можем работать с frame'ом в данном случае, как с простым списком.
Давайте просто обратимся по индексу.
Сделаем вот так, и также получим наши первые три строки.
Аналогично можно вывести последние три строки.
Все очень похоже на обычный список.
Вот так, все работает.
Если же мы хотим сделать что-то более сложное, например, выбрать какой-то
список строк и какой-то список столбцов, мы можем воспользоваться командой loc.
Она позволяет обращаться к нашему data frame с помощью обращения
к названиям наших осей.
Давайте продемонстрируем, как это работает.
Вызываем loc.
Дальше сначала передаем ему список тех строк, которые мы хотим.
Название наших строк — это их индекс, поэтому можем просто написать список цифр.
Допустим, первая, третья, пятая строка.
Дальше говорим, с какими столбцами мы хотим работать.
Давайте выведем Name, например, и City.
Так, теперь видим, что получилось ровно то, что мы хотели: три строчки,
два столбца.
Альтернативно можно обращаться к нашим осям не по имени,
а по позиции, то есть по номеру нашего столбца и по номеру нашей строки.
Это делается с помощью команды iloc.
[ЗВУК] В данном случае первый аргумент не изменится,
потому что названия оси совпадают с ее позициями,
поэтому просто пишем [1, 3, 5], а вот
для обращения к колонкам нам придется просто заменить Name и City на их номера.
Соответственно, это получается что?
У нас получается нулевой и второй номер.
Индексация с нуля.
Да, получили тот же самый срез нашего массива.
Есть еще один способ обратиться к нашему массиву и сделать выборку — это метод ix.
Он умеет работать одновременно и с именами, и с позициями.
Давайте проверим.
Сначала давайте проверим, как он работает с именами.
Повторим те же аргументы, которые мы передавали методу loc.
Соответственно, результат должен быть таким же.
Так, передаем Name и
City и запускаем.
Видим, что выгрузка не изменилась.
А теперь давайте попробуем передать туда номера.
[ЗВУК]
Все точно так же,
поэтому чаще всего разработчики предпочитают использовать сразу ix,
потому что он поддерживает и ту, и другую нотацию.
Так. На самом деле,
мы можем делать не только такие простые выгрузки из нашей таблицы.
Мы можем делать более сложные срезы,
удовлетворяющие некоторым логическим операциям.
Например, мы можем как-нибудь отфильтровать наш dataset.
Давайте возьмем вот этот frame и отфильтруем его по дате рождения,
например, выберем только тех людей, кто старше 85-го года рождения.
Как это можно сделать?
Берем наш data frame.
Говорим, что нас будет интересовать поле «дата рождения».
Указываем его в квадратных скобках.
Дальше записываем явно то логическое выражение, которое мы хотим проверить.
В данном случае нас интересует ≥, и давайте будем сравнивать с 85-м годом.
Так, нам нужно сначала создать наш datetime объект.
Помните, мы заранее поменяли тип нашего столбца,
чтобы мы могли работать с ним, как с датами?
Поэтому теперь, если мы будем сравнивать этот столбец с датой,
то мы получим корректный результат сравнения.
Вот так, 1-е января 85-го года.
Итак, мы видим, что результат соответствует нашему условию:
в таблице остались только те сотрудники, даты рождения которых не раньше,
чем 1 января 1985 года.
Работает это с помощью логических индексов.
Чуть подробнее, что это такое, вы узнаете несколько позже,
когда будете изучать библиотеку NumPy.
Там вы обязательно познакомитесь с этим понятием.
Ну а сейчас мы двигаемся дальше, и давайте мы несколько усложним наши условия.
Сейчас мы проверяли условия только на один столбец.
Давайте проверим сразу несколько.
Так как результат применения нашего условия к стоблцу — логический,
то есть true или false для каждой строки, то на самом деле мы можем применить
некоторую логическую функцию между различными условиями.
Например, мы можем проверить условия на дату рождения,
еще одно условие на дату рождения или на какой-то другой столбец и посмотреть,
скажем, на их пересечение или на их объединение.
Любую логическую функцию.
Давайте сначала возьмем некоторое условие на дату рождения,
даже давайте оставим то же самое, и проверим условие на город.
Например, выберем только тех сотрудников, которые не из Москвы.
Синтаксически это будет выглядеть следующим образом.
Снова берем наш frame и в квадратных скобках записываем условие.
Так как условий будет два,
давайте сразу подготовим круглые скобки для каждого из условий.
И так как мы уже договорились, что мы будем использовать их пересечение,
давайте добавим знак логического «и» между ними.
Так, теперь первое условие оставляем без изменений.
Дата рождения, дата рождения должна быть не раньше, чем 1 января.
Так.
[ЗВУК] И
следующее условие давайте выберем таким: город не равняется Москве.
[ЗВУК] Вот так.
Судя по предыдущей таблице, мы ожидаем получить только одну строчку.
Давайте посмотрим.
Да, ровно так и получилось.
Это было пересечение условий.
А теперь давайте попробуем сделать объединение условий,
то есть логическое «или».
Синтаксис будет очень похож.
Сначала записываем первое условие, давайте снова его оставим.
[ЗВУК]
[ЗВУК] Дальше
наберем знак логического «или» и запишем второе условие.
Давайте выберем тех людей, которые из Волгограда.
[ЗВУК] Запускаем
нашу команду и видим, что у нас появилось два типа людей.
Первые — те, у кого город равняется Волгограду, это первый человек,
и все остальные — те, у кого дата рождения позже 1-го января 85-го года.
На этом мы закончим работу с data frame.
Вы уже научились создавать data frame, модифицировать их,
применять к ним различные функции, работать с индексами и делать выборки.
На самом деле, это только вершина айсберга, но нам пора двигаться дальше,
и в следующей видеолекции вы будете изучать библиотеку NumPy.