- Объединение таблиц в Pandas: merge, join и concatenate
- Основы Pandas №3 // Важные методы форматирования данных
- Merge в pandas («объединение» Data Frames)
- Как делается merge?
- Способы объединения: inner, outer, left, right
- Merge в pandas. По какой колонке?
- Сортировка в pandas
- reset_index()
- Fillna
- Проверьте себя
- Решение задания №1
- Решение задания №2
- Итого
- Как объединить фреймы данных в Pandas – merge(), join(), append(), concat() и update()
- Как объединить фреймы данных в Pandas – merge(), join(), append(), concat() и update()
- Вступление
- Слияние Фреймов Данных С Помощью merge()
- Слияние Фреймов Данных С Помощью join()
- Слияние Фреймов Данных С Помощью append()
- Слияние Фреймов Данных С Помощью concat()
- Слияние Фреймов данных С помощью combine_first() и update()
- Вывод
Объединение таблиц в Pandas: merge, join и concatenate
Люди, которые работают с sql, знают, что для объединения таблиц используется операция join. В библиотеке Pandas также предусмотрен join, но помимо него, есть еще такие табличные функции объединения, как merge и concatenate. Когда только-только знакомишься с этими функциями разница между ними неочевидна, поэтому я предлагаю вам краткий обзор отличительных особенностей всех этих операций.
Join
Из трех операций объединения датафреймов join является наиболее простым и предлагает минимум «средств управления» объединения ваших таблиц.
Он объединит все столбцы из двух таблиц с общими столбцами, переименованными в определенные lsuffix и rsuffix. Способ объединения строк из двух таблиц определяется с помощью how – inner, outer, right, left (по умолчанию) аналогично sql. Визуализировать понимание соединения таблиц всеми этими способами могут схемы, изображенные с помощью кругов Эйлера:
Рассмотрим как работает объединение с помощью Join на примере:
Merge
Аналогично предыдущей функции merge также объединяет все столбцы из двух таблиц с общими столбцами, переименованными в определенные suffixes. Но в отличие от join, merge уже предлагает три способа организации построчного выравнивания. Первый способ заключается в использовании on = «НАЗВАНИЕ СТОЛБЦА», в этом случае столбец должен быть общим столбцом в обеих таблицах. Второй способ — использовать left_on = «НАЗВАНИЕ СТОЛБЦА» и right_on = «НАЗВАНИЕ СТОЛБЦА». Такой способ позволяет объединить две таблицы, используя два разных столбца. Третий способ — использовать left_index = True и right_index = True, в данном случае таблицы будут объединены по индексам.
Рассмотрим на примере:
Concatenate
В отличии от join и merge, которые по умолчанию работают со столбцами, concat позволяет выбрать, хотим ли мы выполнять объединение по столбцам или по строкам. Для этого в аргументе функции необходимо прописать axis=0 или axis=1, в первом случае вторая таблица будет присоединена к первой снизу, во втором – справа.
Рассмотрим на примере:
Append
Напоследок будет уместно упомянуть такую функцию как append(). Она несколько выбивается из перечня ранее упомянутых функций, но тем не менее ее также можно считать инструментом объединения таблиц. Append() используется для добавления строк одного датафрейма в конец другого, возвращая новый датафрейм. Столбцы, не входящие в исходный датафрейм, добавляются как новые столбцы, а новые ячейки заполняются значениями NaN.
Рассмотрим на примере:
Мы рассмотрели основные различия функций объединения датафреймов в Pandas. Join и merge работают со столбцами, и переименовывает общие столбцы, используя заданный суффикс. Но merge позволяет более гибко настроить построчное выравнивание. В отличии от join и merge, concat позволяет работать как со столбцами, так и со строками, но не дает переименовывать строки/столбцы.
Источник
Основы Pandas №3 // Важные методы форматирования данных
Это третья часть руководства по pandas, в которой речь пойдет о методах форматирования данных, часто используемых в проектах data science: merge , sort , reset_index и fillna . Конечно, есть и другие, поэтому в конце статьи будет шпаргалка с функциями и методами, которые также могут пригодиться.
Примечание: это руководство, поэтому рекомендуется самостоятельно писать код, повторяя инструкции!
Merge в pandas («объединение» Data Frames)
В реальных проектах данные обычно не хранятся в одной таблице. Вместо нее используется много маленьких. И на то есть несколько причин. С помощью нескольких таблиц данными легче управлять, проще избегать «многословия», можно экономить место на диске, а запросы к таблицам обрабатываются быстрее.
Суть в том, что при работе с данными довольно часто придется вытаскивать данные из двух и более разных страниц. Это делается с помощью merge .
Примечание: хотя в pandas это называется merge , метод почти не отличается от JOIN в SQL.
Рассмотрим пример. Для этого можно взять DataFrame zoo (из предыдущих частей руководства), в котором есть разные животные. Но в этот раз нужен еще один DataFrame — zoo_eats , в котором будет описаны пищевые требования каждого вида.
Теперь нужно объединить два эти Data Frames в один. Чтобы получилось нечто подобное:
В этой таблице можно проанализировать, например, сколько животных в зоопарке едят мясо или овощи.
Как делается merge?
В первую очередь нужно создать DataFrame zoo_eats , потому что zoo уже имеется из прошлых частей. Для упрощения задачи вот исходные данные:
О том, как превратить этот набор в DataFrame, написано в первом уроке по pandas. Но есть способ для ленивых. Нужно лишь скопировать эту длинную строку в Jupyter Notebook pandas_tutorial_1 , который был создан еще в первой части руководства.
И вот готов DataFrame zoo_eats .
Теперь пришло время метода merge:
(А где же все львы? К этому вернемся чуть позже).
Это было просто, не так ли? Но стоит разобрать, что сейчас произошло:
Сначала был указан первый DataFrame ( zoo ). Потом к нему применен метод .merge() . В качестве его параметра выступает новый DataFrame ( zoo_eats ). Можно было сделать и наоборот:
Это то же самое, что и:
Разница будет лишь в порядке колонок в финальной таблице.
Способы объединения: inner, outer, left, right
Базовый метод merge довольно прост. Но иногда к нему нужно добавить несколько параметров.
Один из самых важных вопросов — как именно нужно объединять эти таблицы. В SQL есть 4 типа JOIN.
В случае с merge в pandas в теории это работает аналогичным образом.
При выборе INNER JOIN (вид по умолчанию в SQL и pandas) объединяются только те значения, которые можно найти в обеих таблицах. В случае же с OUTER JOIN объединяются все значения, даже если некоторые из них есть только в одной таблице.
Конкретный пример: в zoo_eats нет значения lion . А в zoo нет значения giraffe . По умолчанию использовался метод INNER, поэтому и львы, и жирафы пропали из таблицы. Но бывают случаи, когда нужно, чтобы все значения оставались в объединенном DataFrame. Этого можно добиться следующим образом:
В этот раз львы и жирафы вернулись. Но поскольку вторая таблица не предоставила конкретных данных, то вместо значения ставится пропуск ( NaN ).
Логичнее всего было бы оставить в таблице львов, но не жирафов. В таком случае будет три типа еды: vegetables , meat и NaN (что, фактически, значит, «информации нет»). Если же в таблице останутся жирафы, это может запутать, потому что в зоопарке-то этого вида животных все равно нет. Поэтому следует воспользоваться параметром how=’left’ при объединении.
Теперь в таблице есть вся необходимая информация, и ничего лишнего. how = ‘left’ заберет все значения из левой таблицы ( zoo ), но из правой ( zoo_eats ) использует только те значения, которые есть в левой.
Еще раз взглянем на типы объединения:
Примечание: «Какой метод merge является самым безопасным?» — самый распространенный вопрос. Но на него нет однозначного ответа. Нужно решать в зависимости от конкретной задачи.
Merge в pandas. По какой колонке?
Для использования merge библиотеке pandas нужны ключевые колонки, на основе которых будет проходить объединение (в случае с примером это колонка animal ). Иногда pandas не сможет распознать их автоматически, и тогда нужно указать названия колонок. Для этого нужны параметры left_on и right_on .
Например, последний merge мог бы выглядеть следующим образом:
Примечание: в примере pandas автоматически нашел ключевые колонки, но часто бывает так, что этого не происходит. Поэтому о left_on и right_on не стоит забывать.
Merge в pandas — довольно сложный метод, но остальные будут намного проще.
Сортировка в pandas
Сортировка необходима. Базовый метод сортировки в pandas совсем не сложный. Функция называется sort_values() и работает она следующим образом:
Примечание: в прошлых версиях pandas была функция sort() , работающая подобным образом. Но в новых версиях ее заменили на sort_values() , поэтому пользоваться нужно именно новым вариантом.
Единственный используемый параметр — название колонки, water_need в этом случае. Довольно часто приходится сортировать на основе нескольких колонок. В таком случае для них нужно использовать ключевое слово by :
Примечание: ключевое слово by можно использовать и для одной колонки zoo.sort_values(by = [‘water_need’] .
sort_values сортирует в порядке возрастания, но это можно поменять на убывание:
reset_index()
Заметили ли вы, какой беспорядок теперь в нумерации после последней сортировки?
Это не просто выглядит некрасиво… неправильная индексация может испортить визуализации или повлиять на то, как работают модели машинного обучения.
В случае изменения DataFrame нужно переиндексировать строки. Для этого можно использовать метод reset_index() . Например:
Можно заметить, что новый DataFrame также хранит старые индексы. Если они не нужны, их можно удалить с помощью параметра drop=True в функции:
Fillna
Примечание: fillna — это слова fill( заполнить) и na(не доступно).
Запустим еще раз метод left-merge:
Это все животные. Проблема только в том, что для львов есть значение NaN . Само по себе это значение может отвлекать, поэтому лучше заменять его на что-то более осмысленное. Иногда это может быть 0 , в других случаях — строка. Но в этот раз обойдемся unknown . Функция fillna() автоматически найдет и заменит все значения NaN в DataFrame:
Примечание: зная, что львы едят мясо, можно было также написать zoo.merge(zoo_eats, how=’left’).fillna(‘meat’) .
Проверьте себя
Вернемся к набору данных article_read .
Примечание: в этом наборе хранятся данные из блога о путешествиях. Загрузить его можно здесь. Или пройти весь процесс загрузки, открытия и установки из первой части руководства pandas.
Скачайте еще один набор данных: blog_buy . Это можно сделать с помощью следующих двух строк в Jupyter Notebook:
Набор article_read показывает всех пользователей, которые читают блог, а blog_buy — тех, купил что-то в этом блоге за период с 2018-01-01 по 2018-01-07.
- Какой средний доход в период с 2018-01-01 по 2018-01-07 от пользователей из article_read ?
- Выведите топ-3 страны по общему уровню дохода за период с 2018-01-01 по 2018-01-07 . (Пользователей из article_read здесь тоже нужно использовать).
Решение задания №1
Средний доход — 1,0852
Для вычисления использовался следующий код:
Примечание: шаги использовались, чтобы внести ясность. Описанные функции можно записать и в одну строку.`
- На скриншоте также есть две строки с импортом pandas и numpy, а также чтением файлов csv в Jupyter Notebook.
- На шаге №1 объединены две таблицы ( article_read и blog_buy ) на основе колонки user_id . В таблице article_read хранятся все пользователи, даже если они ничего не покупают, потому что ноли ( 0 ) также должны учитываться при подсчете среднего дохода. Из таблицы удалены те, кто покупали, но кого нет в наборе article_read . Все вместе привело к left-merge.
- Шаг №2 — удаление ненужных колонок с сохранением только amount .
- На шаге №3 все значения NaN заменены на 0 .
- В конце концов проводится подсчет с помощью .mean() .
Решение задания №2
Найдите топ-3 страны на скриншоте.
- Тот же метод merge , что и в первом задании.
- Замена всех NaN на 0 .
- Суммирование всех числовых значений по странам.
- Удаление всех колонок кроме amount .
- Сортировка результатов в убывающем порядке так, чтобы можно было видеть топ.
- Вывод только первых 3 строк.
Итого
Это был третий эпизод руководства pandas с важными и часто используемыми методами: merge, sort, reset_index и fillna .
Источник
Как объединить фреймы данных в Pandas – merge(), join(), append(), concat() и update()
В этом уроке мы будем объединять фреймы данных в Панд с помощью функции слияния. Мы также объединим данные с примерами join, append, concat, combine_first и update.
Автор: Ruslan Hasanov
Дата записи
Как объединить фреймы данных в Pandas – merge(), join(), append(), concat() и update()
Вступление
Pandas предоставляет огромный спектр методов и функций для манипулирования данными, включая слияние фреймов данных. Слияние фреймов данных позволяет как создать новый фрейм данных без изменения исходного источника данных, так и изменить исходный источник данных.
Если вы знакомы с SQL или аналогичным типом табличных данных, вы, вероятно, знакомы с термином join , который означает объединение фреймов данных для формирования нового фрейма данных. Если вы новичок, вам может быть трудно полностью понять типы соединений ( внутренний, внешний, левый, правый ). В этом уроке мы рассмотрим типы соединений с примерами.
Наше основное внимание будет сосредоточено на использовании функций merge() и concat () . Однако мы обсудим другие новые методы, чтобы дать вам как можно больше практических альтернатив.
Для этого урока мы используем версию Pandas 1.1.4 и NumPy версия 1.19.4 .
Для вашего удобства вот оглавление:
- Слияние Фреймов Данных С Помощью merge()
- Слияние Фреймов Данных С Помощью join()
- Слияние Фреймов Данных С Помощью append()
- Слияние Фреймов Данных С Помощью concat()
- Слияние Фреймов данных С помощью combine_first() и update()
Слияние Фреймов Данных С Помощью merge()
Давайте начнем с настройки Фреймов данных, которые мы будем использовать в оставшейся части урока.
df1 будет включать в себя наш воображаемый список пользователей с именами, электронными письмами и идентификаторами.
При проектировании баз данных рекомендуется хранить настройки профиля (например, цвет фона, ссылку на изображение аватара, размер шрифта и т. Д.) в отдельной таблице от пользовательских данных (электронная почта, дата добавления и т. Д.). Затем эти таблицы могут иметь отношение “один к одному”.
Чтобы смоделировать этот сценарий, мы сделаем то же самое, создав df2 с URL-адресами изображений и идентификаторами пользователей:
Вот как выглядят наши фреймы данных:
Давайте объединим эти фреймы данных с функцией merge () . Во-первых, взгляните на все варианты, которые эта функция может принять с первого взгляда:
Большинство этих параметров имеют значение по умолчанию, за исключением left и right . Эти два параметра являются именами Фреймов данных, которые мы будем объединять. Сама функция вернет новый фрейм данных, который мы будем хранить в переменной df3_merged .
Введите следующий код в оболочку Python:
Поскольку оба наших фрейма данных имеют столбец user_id с одинаковым именем, функция merge() автоматически соединяет две таблицы, совпадающие по этому ключу. Если бы у нас было два столбца с разными именами, мы могли бы использовать left_on=’left_column_name’ и right_on=’right_column_name’ для явного указания ключей на обоих фреймах данных.
Давайте напечатаем переменную df3_merged , чтобы увидеть ее содержимое:
Вы заметите, что df 3_merged имеет только 5 строк, в то время как исходный df1 имел 7. Почему это?
Когда значение по умолчанию параметра how установлено в inner , новый Фрейм данных генерируется из пересечения левого и правого фреймов данных. Поэтому, если user_id отсутствует в одной из таблиц, он не будет находиться в объединенном фрейме данных.
Это останется верным даже если поменять местами левый и правый ряды:
Результаты все еще есть:
Пользователи с идентификаторами ‘id 006’ и ‘id 007’ не являются частью объединенных фреймов данных, так как они не пересекаются в обеих таблицах.
Однако иногда мы хотим использовать один из Фреймов данных в качестве основного Фрейма данных и включить в него все строки из него, даже если они не все пересекаются друг с другом. То есть иметь всех наших пользователей, в то время как image_url является необязательным.
Как? Используя merge() , мы можем передать аргумент ‘left’ параметру how :
С помощью left join мы включили все элементы левого фрейма данных ( df1 ) и каждый элемент правого фрейма данных ( df2 ). Запуск приведенного выше кода будет отображать следующее:
Ячейки, которые не имеют совпадающих значений с левым фреймом данных, заполняются NaN .
Почему бы нам не попробовать правильно присоединиться? Создайте следующий объединенный фрейм данных:
Как вы, возможно, и ожидали, right join вернет все значения из левого фрейма данных, которые соответствуют правому фрейму данных:
Поскольку каждая строка в df2 имеет значение в df1 , это right join в данном случае аналогично inner join.
Давайте посмотрим на внешние соединения. Чтобы лучше проиллюстрировать, как они работают, давайте поменяем местами наши фреймы данных и создадим 2 новые переменные как для левого, так и для внешнего соединения:
Имейте в виду, что наш левый фрейм данных-это df2 , а правый Фрейм данных – df1 . Использование how=’outer’ объединяет фреймы данных, совпадающие по ключу , но также включает значения, которые отсутствуют или не совпадают.
Мы также добавили флаг indicator и установили его на True так что Панды добавляют дополнительный столбец _merge в конец нашего фрейма данных. Этот столбец сообщает нам, была ли найдена строка в левом, правом или обоих кадрах данных.
Переменная df_left выглядит следующим образом:
Однако df_outer имеет эти данные:
Обратите внимание, что в df_outer DataFrame id006 и id007 существуют только в правом фрейме данных (в данном случае это df1 ). Если бы мы попытались сравнить левое и внешнее соединения, не меняя местами, то получили бы одинаковые результаты для обоих.
Слияние Фреймов Данных С Помощью join()
В отличие от merge () , который является методом экземпляра Pandas, join() является методом самого фрейма данных. Это означает, что мы можем использовать его как статический метод в DataFrame: DataFrame.join(other. ) .
Фрейм данных, из которого мы вызываем join() , будет нашим левым фреймом данных. Фрейм данных в аргументе other будет нашим правым фреймом данных.
Параметр on может принимать один или несколько аргументов ( [‘key1’, ‘key2’ . ] ) для определения соответствующего ключа, в то время как параметр how принимает один из аргументов дескриптора (left, right, outer, inner) и по умолчанию имеет значение left .
Давайте попробуем присоединиться df2 к df1 :
Как и функция merge () , функция join() автоматически пытается сопоставить ключи (столбцы) с одинаковыми именами. В нашем случае это ключ user_id .
Приведенный выше код выводит следующее:
Вы, вероятно, заметили “дубликат столбца” под названием user_id_right . Если вы не хотите отображать этот столбец, вы можете установить столбцы user_id в качестве индекса для обоих столбцов, чтобы они соединялись без суффикса:
Таким образом, мы избавляемся от столбца user_id и устанавливаем его в качестве столбца индекса. Это дает нам более чистый результирующий фрейм данных:
Слияние Фреймов Данных С Помощью append()
Как указывает официальная документация Pandas, поскольку методы concat() и append() возвращают новые копии фреймов данных, чрезмерное использование этих методов может повлиять на производительность вашей программы.
Добавление очень полезно, когда вы хотите объединить два фрейма данных только по оси строк. Это означает, что вместо сопоставления данных в их столбцах нам нужен новый фрейм данных, содержащий все строки из 2 фреймов данных.
Давайте добавим df2 к df1 и распечатаем результаты:
Использование append() не будет соответствовать кадрам данных ни на одном из ключей. Он просто добавит другой фрейм данных к первому и вернет его копию. Если формы Фреймов данных не совпадают, Панды заменят любые несопоставимые клетки Человеком.
Вывод для добавления двух фреймов данных выглядит следующим образом:
Большинство пользователей выбирают concat() вместо append () , поскольку он также предоставляет опцию сопоставления клавиш и оси.
Слияние Фреймов Данных С Помощью concat()
Конкатенация немного более гибкая по сравнению с merge() и join () , поскольку она позволяет нам объединять фреймы данных либо вертикально (по строкам), либо горизонтально (по столбцам).
Компромисс заключается в том, что любые данные, которые не совпадают, будут отброшены. Вот полная функция с параметрами:
Вот наиболее часто используемые параметры для функции concat() :
- objs – это список объектов DataFrame ([df1, df2,…]), которые должны быть объединены
- ось определяет направление конкатенации, 0 для гребных и 1 для колонны-мудро
- join может быть либо inner (пересечение), либо outer (объединение)
- ignore_index по умолчанию установлено значение False , которое позволяет значениям индекса оставаться такими, какими они были в исходных кадрах данных, может привести к дублированию значений индекса. Если установлено значение True , он будет игнорировать исходные значения и повторно назначать значения индекса в последовательном порядке
- keys позволяет нам построить иерархический индекс. Думайте об этом как о другом уровне индекса, добавляемом во внешнюю левую часть фрейма данных, который помогает нам различать индексы, когда значения не уникальны
Давайте создадим новый фрейм данных с теми же типами столбцов , что и df2 , но этот включает в себя image_url для id006 и id007 :
Чтобы объединить df2 и df2_addition по строкам, мы можем передать их в список в качестве параметра obj и назначить результирующий фрейм данных новой переменной:
Мы успешно заполнили недостающие значения:
Однако взгляните на индексы в самом левом столбце. Индексы 0 и 1 повторяются. Чтобы получить совершенно новые и уникальные значения индекса, мы передаем True параметру ignore_index :
Теперь наш df_row_concat имеет уникальные значения индекса:
Как мы уже упоминали ранее, конкатенация может работать как по горизонтали, так и по вертикали. Чтобы соединить два фрейма данных вместе по столбцам, нам нужно будет изменить значение axis по умолчанию 0 чтобы 1 :
Вы заметите, что это не работает как слияние, сопоставляя две таблицы по ключу:
Если бы наш правый фрейм данных даже не имел столбца user_id , эта конкатенация все равно вернула бы тот же результат. Функция concat() склеивает два фрейма данных вместе, принимая во внимание значения индексов фреймов данных и форму таблицы
Он не выполняет сопоставление ключей, как merge() или join() . Попробуйте различные комбинации конкатенаций, изменив параметр join , чтобы увидеть различия!
Слияние Фреймов данных С помощью combine_first() и update()
В некоторых случаях вам может потребоваться заполнить недостающие данные в вашем фрейме данных, объединив их с другим фреймом данных. Таким образом, вы сохраните все не пропущенные значения в первом кадре данных, заменив все значения NaN доступными не пропущенными значениями из второго кадра данных (если таковые имеются).
В этом примере мы импортируем NumPy для использования значений NaN . Если вы установили Pandas с помощью pip , NumPy уже должен быть установлен.
Введите следующий код в оболочку Python или файл скрипта:
Фрейм данных df_first имеет 3 столбца и 1 пропущенное значение в каждом из них:
В то время как df_second имеет только 2 столбца и одно пропущенное значение в первом столбце:
Мы можем использовать df_second to patch missing values in df_first со всеми соответствующими значениями:
Как уже упоминалось ранее, использование метода combine_first() заменит только значения NaN в индексном порядке и оставит все не пропущенные значения в первом кадре данных такими, какие они есть:
С другой стороны, если бы мы хотели перезаписать значения в df_first соответствующими значениями из df_second (независимо от того, являются они NaN или нет), мы бы использовали метод update () .
Давайте сначала добавим еще один фрейм данных в наш код:
Форма (1, 3) – 1 строка и три столбца, исключая индекс:
Теперь давайте обновим df_first значениями из df_third :
Имейте в виду, что в отличие от combine_first () , update() не возвращает новый фрейм данных. Он изменяет df_first на месте, изменяя соответствующие значения:
Параметр overwrite функции update() имеет значение True по умолчанию. Вот почему он изменяет все соответствующие значения, а не только значения NaN . Мы можем изменить его на False , чтобы заменить только NaN значения:
Вот конечное состояние нашего df_tic tac toe фрейма данных:
Мы не только успешно обновили ценности, но и выиграли игру в крестики-нолики!
Вывод
Pandas предоставляет мощные инструменты для объединения фреймов данных. Но бывает трудно решить, когда и что использовать. Хотя в большинстве случаев функции merge() достаточно, в некоторых случаях вы можете использовать concat() для слияния строк, или использовать join() с суффиксами, или избавиться от пропущенных значений с помощью combine_first() и update() . Вы даже можете добавить строки данных с помощью append() .
Используйте функцию, которая вам наиболее удобна и лучше всего подходит для выполнения поставленной задачи. Как эти функции помогут вам манипулировать данными в Панд?
Источник