На завершающем уроке «Мастерской» по библиотеке Pandas мы научимся объединять датафреймы, применять lambda-функции и работать с большими файлами.

Видео: Илья Градусов

1. Объединнение датафреймов методами merge и concat

Объединение датафреймов — задача, которую приходится решать довольно часто. Чтобы научиться это делать, скачаем еще один файл в дополнение к данным по смертности, с которыми мы работали во время первых двух уроков. Скачаем файл на том же сайте Проекта по изучению глобального бремени болезней Института оценки показателей здоровья США (IHME GBD). Выберем те же показатели, что на первом занятии, только в графе measure выберем не deaths, а DALYs (Disability-Adjusted Life Years). Этот показатель означает, сколько лет здоровой и продуктивной жизни люди теряют из-за нетрудоспособности и ранней смерти от разных болезней. Его еще называют измерением разрыва между текущим состоянием здоровья людей и идеальной ситуацией, когда все население доживает до преклонного возраста, не страдая от болезней и инвалидности. 

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

Файл 1 — новый, с показателями DALY.

Файл 2 — прежний, с показателями смертности, deaths.

Импортируем библиотеку Pandas и загрузим оба файла.

Некоторые значения в столбцах в обоих датафреймах совпадают, а некоторые отличаются. Страна (location), пол (sex), возрасты (age), причины (cause), год (year) — одинаковые. А вот измерение (measure), а также числовые показатели val, upper и lower отличаются. В столбце metric тоже разные значения. Давайте объединим эти датафреймы, просто добавив новые значения (DALY, число потерянных лет из-за нетрудоспособности и ранней смерти от разных болезней) к тем данных по смертности, что у нас уже есть.

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

И объединим методом merge().

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

inner — только общие, совпадающие в обоих датафреймах

outer — все строки из всех датафреймов, не важно, совпадающие или нет

left — только совпадающие строки плюс все строки из левого датафрейма

right — только совпадающие строки плюс все строки из правого датафрейма

Параметры аргумента how в методе merge() библиотеки Pandas
Параметры аргумента how в методе merge() библиотеки Pandas
Картинка: «Важные истории»

Еще один метод объединения датафреймов — concat(). Чтобы его опробовать, разделим датафрейм на две части. В первой будут строки с первой до 50 000, во второй с 50 000 и до последней. А затем объединим их обратно методом concat(). Аргумент axis = 0 опять означает, что объединяем по строкам, а не по столбцам.

2.1. Добавление новых столбцов с помощью математических операций

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

Точно так же можно создать новый столбец на основе не одного, а нескольких других столбцов. Например, суммируя их. Попробуем суммировать столбцы death_val, death_upper, death_lower. В случае с нашими данными сумма этих показателей нам ничего не даст, это нужно просто для тренировки.

Появился новый столбец deaths_total. Точно так же можно суммировать с помощью сочетания методов loc и sum (вместо sum может быть и mean (среднее), median (медиана), std (стандартное отклонение), min, max и пр.).

Точно так же можно использовать iloc. Столбец deaths_val по счету 11-ый, deaths_lower — 13-ый.

Но сумма в столбце total_iloc отличается. Это потому, что метод iloc не включает правый край, то есть столбец номер 13 (deaths_lower) не посчитался. Нужно заменить 13 на 14, чтобы он тоже суммировался.

Удалим новые столбцы, чтобы не мешали.

2.2. Добавление новых столбцов с помощью функций

В Pandas очень удобно пользоваться короткими lambda-функциями, которые открывают много возможностей для анализа данных. Например, давайте создадим новый столбец, в котором будет True, если страна (location) входила в 2020 году в СНГ, и False, если нет. Представим, что нам зачем-то нужна эта информация. Для начала создадим список таких стран.

Затем создадим новый столбец и пропишем функцию, которая будет применяться к столбцу location и на его основе создавать нужный нам столбец: если страна входит в СНГ, напротив нее будет True, если нет, то False.

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

Но lambda-функция подходит, только если функция короткая и простая. Если она сложнее, то нужно отдельно прописать ее и затем точно так же подставить для создания нового столбца. Пропишем ту же функцию, что и выше со странами СНГ, но отдельно. Точно также можно прописать любую более сложную функцию. Урок по функциям можно найти здесь.

3. Работа с большими файлами

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

Например, установим аргумент chunksize для нашего датафрейма в 50 000 строк. Это значит, что наш файл, в котором около 80 000 строк, будет разделен на две части. Попробуем его применить и выведем эти части на экран, чтобы посмотреть, как это выглядит.

С каждым из файлов теперь можно проделать какие-то операции по отдельности — выбрать нужные строки, посчитать параметры, удалить ненужное, а затем объединить их уже в более компактный датафрейм. Например, применим функцию groupby отдельно для каждой части и затем склеим их в одну. Чтобы это сделать, сначала нам нужно создать пустой датафрейм, а затем присоединять к нему результаты применения метода groupby для каждой части. Подробнее о методе groupby — во втором уроке. В получившемся датафрейме у нас будут не все строки из всех частей, а только нужные нам расчеты: как менялась средняя смертность и потерянные трудоспособные годы жизни от разных причин с годами.

Вот и всё, мы познакомились с основами библиотеки Pandas. Полученных знаний будет достаточно для того, чтобы начать анализировать данные. Конечно, мы рассказали не обо всех методах и нюансах, для этого есть подробные онлайн-курсы и книги. Более того, библиотека Pandas насколько хорошо изучена и популярна, что можно сформулировать буквально любой запрос: например, как разбить числовой столбец на интервалы, как объединить много файлов в один, как загрузить json, и в интернете будет множество вариантов того, как это сделать в Pandas.

Тетрадку с этого урока можно найти здесь. Если вы захотите задать вопросы и пообщаться, пишите нам в чат в Telegram. Если вам нравится «Мастерская», вы также можете оформить пожертвование. Ждем вас на следующих уроках!