Python: Pandas
Теория: Изменение формы и объединение таблиц
В работе с данными приходится собирать их из разных источников и объединять в единую структуру. В библиотеке Pandas реализован функционал для таких операций над табличными данными в виде методов:
concat()join()merge()
На данном уроке рассмотрим практические случаи, в которых они применяются.
Метод concat()
За основу возьмем данные о кликах на сайтах 4 магазинов за 28 дней.
Разобьем исходные данные на два датафрейма за первую и вторую недели месяца. Это операция делается с использованием срезов.
Операция, обратная разбиению — конкатенация, применяется, чтобы собрать куски данных в единый фрагмент. Если предположить, что отчетные материалы за разные недели лежат в разных таблицах, а для аналитика необходимо поработать над всеми значениями сразу, то можно использовать метод concat(). В качестве параметров ему передается список тех датасетов, которые необходимо объединить:
Рассмотрим ситуацию, в которой данные разбиты по парам магазинов. Возможно, это данные из разных городов, и лежат они в разных таблицах баз данных:
Чтобы собрать их в единое целое, применяется метод concat(), но указывается направление объединения с помощью параметра axis:
- 0 - объединение происходит по строкам
- 1 - по столбцам
Стоит быть внимательными с направлением объединения. Если его не указать в данном примере, то результат будет не тот, который ожидается:
Фрагменты данных наподобие срезов по неделям и парам магазинов довольно типичная ситуация. Однако бывают случаи, когда срезы делаются по разным пересекающимся промежуткам времени. Рассмотрим данные кликов для пар магазинов за пять рабочих дней:
Здесь дни месяца не совпадают, но пересекаются. Для объединения также используется метод concat(), который объединит по соответствующим индексам и оставит пропуски в тех днях, для которых значений нет.
Метод join()
Метод concat() позволяет производить операции конкатенации по направлениям. Однако при работе с данными часто требуется более сложное объединение по индексам. Одним из методов для таких операций является метод join():
Важно отметить, что join() — это метод объекта DataFrame, который позволяет объединять два датафрейма по индексам. При этом результат зависит от того, к какому датафрейму применяется метод. Если поменять местами датафреймы в примере выше, результат будет отличаться:
В примерах выше результирующий датафрейм содержит все индексы того датафрейма, к которому применялся метод. Такой способ объединения соответствует left join и применяется по умолчанию. Метод join() поддерживает различные сценарии объединения, включая:
inner join— объединение по пересечению индексовleft join— включает все индексы левого датафреймаright join— включает все индексы правого датафреймаouter join— объединение по всем индексам обоих датафреймов
Для их использования задаётся параметр how:
left join:
right join:
inner join:
outer join:
Метод join() работает по индексам по умолчанию, но можно указывать конкретные колонки через параметр on. Если нужно объединять по колонкам с разными названиями, лучше использовать merge().
Метод merge()
Объединение данных можно производить не только по индексам, но и по столбцам значений двух датафреймов. Для этого не достаточно функционала метода join(), который может производить объединения по индексам датафреймов. Для таких случаев в Pandas используется метод merge().
Рассмотрим датасет с кликами, в котором дни месяца указаны в столбце day, а не в индексе строк:
Будем решать задачу по объединению двух датасетов, содержащих пятидневные срезы по парам магазинов:
Для их объединения необходимо указать сперва левый, а затем правый датафреймы. Также нужно определить по каким столбцам в каждом из датафреймов будет происходить объединение.
Также как и в методе join() в методе merge() поддерживаются различные сценарии объединения данных:
inner merge:
left merge:
right merge:
outer merge:
Метод merge() чаще используется для объединения по колонкам, а join() — по индексам. Можно объединять по нескольким колонкам одновременно, передав список: on=['key1','key2']. Метод merge() полностью аналогичен SQL JOIN по типу объединения (inner, left, right, outer).
Выводы
На данном уроке мы познакомились с различными методами Pandas для объединения табличных данных. Рассмотренные методы применяются по мере усложнения производимой операции:
concat()- данные объединяются по строкам или по столбцам с сохранением всех значенийjoin()- объединяюся датафреймы по индексамmerge()- объединяются датафреймы по наборам столбцов
Как мы увидели, методы join() и merge() поддерживают при этом различные сценарии объединений. Используя набор данных методов, аналитик может собирать довольно сложные таблицы по набору фрагментов данных.

