Введение

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

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

В этой статье мы рассмотрим альтернативы удобным методам dplyr для выполнения всех видов объединений.

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

Что вы узнаете

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

Прочитав эту статью, вы можете ожидать изучения основных переводов Python для следующих функций:

  • left_join
  • право_присоединиться
  • внутреннее соединение
  • внешнее_соединение
  • анти_присоединение
  • semi_join

Обзор объединений

Функции соединения используются для объединения двух или более фреймов данных на основе общего столбца.

Ниже приведен краткий обзор различных определений

  • left_join: возвращает все строки из левой таблицы и любые совпадающие строки из правой таблицы
  • right_join: возвращает все строки из правой таблицы и любые совпадающие строки из левой таблицы.
  • inner_join: возвращает только те записи, которые присутствуют в обеих таблицах.
  • external_join: эта функция возвращает все строки из обеих таблиц и заполняет любые отсутствующие значения NA.
  • anti_join: эта функция возвращает все строки из левой таблицы, которые не совпадают в правой таблице.
  • semi_join: эта функция возвращает все строки из левой таблицы, которые совпадают в правой таблице.

Время сравнения

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

# libraries
import pandas as pd
# sample df1
df1 = pd.DataFrame({
    'join_column': ['A', 'B', 'C', 'D'],
    'col1': [10, 20, 30, 40],
    'col2': [100, 200, 300, 400]
})
# sample df2
df2 = pd.DataFrame({
    'join_column': ['B', 'D', 'E', 'F'],
    'col3': ['X', 'Y', 'Z', 'W'],
    'col4': ['P', 'Q', 'R', 'S']
})

С этим покончено, давайте погрузимся

Левое соединение

R

В r вы получаете удовольствие от простоты и потока dplyr, вы указываете интересующий вас фрейм данных, в данном случае df1, и присоединяете к нему df2 в общем поле.

df3 <- df1 %>%
    left_join(df2, by = "join_column")

Питон

К счастью, в Python все не так уж и отличается. Основное различие заключается в синтаксисе, merge по сравнению с left_join, on, а не by и так далее.

Еще одно отличие состоит в том, что мы можем использовать .merge в качестве метода для левого фрейма данных. Одним из интересных и более удобных аспектов слияния является параметр how. Это позволяет нам определить интересующий нас тип соединения. Не то чтобы было так уж сложно запомнить left_join, right_join, inner_join, но эй… иногда нужно получать удовольствие от простых вещей.

df3 = df1.merge(df2, on = "join_column", how = "left")

Еще одно замечание: вы также можете вызывать слияние как функцию, и в этом случае команда будет выглядеть так:

df3 = pd.merge(df1, df2, on = "join_column", how = "left")

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

Результат:

Право присоединиться

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

Мы рассмотрим примеры здесь.

R

Единственное, что здесь меняется, это функция

df3 <- df1 %>%
    right_join(df2, by = "join_column")

Питон

df3 = df1.merge(df2, on = "join_column", how = "right")

Результат:

Внутреннее соединение

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

R

df3 <- df1 %>%
    inner_join(df2, by = "join_column")

Питон

df3 = df1.merge(df2, on = "join_column", how = "inner")

Результат:

Внешнее соединение

R

df3 <- df1 %>%
    outer_join(df2, by = "join_column")

Питон

df3 = df1.merge(df2, on = "join_column", how = "outer")

Анти присоединение

Вот где Python вмешивается немного больше, но в его защиту анти-объединения не самые распространенные.

R

df3 <- df1 %>%
    anti_join(df2, by = "join_column")

Питон

df3 = df1.merge(df2["join_column"], on = "join_column", how = "left", indicator=True)
.query('_merge == "left_only"')
.drop('_merge', 1)

Здесь нужно объяснить несколько разных частей.

Когда мы устанавливаем для параметра indicator значение True, добавляется новый столбец с именем «_merge», который в случае левого соединения говорит «left_only» или «both». Как вы могли догадаться, «left_only» означает, что совпадения в правом фрейме данных не было, а в случае «обоих» совпадение было.

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

И, наконец, в качестве небольшой очистки мы удаляем столбец «_merge».

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

Как я уже сказал, намного сложнее, но все еще достаточно просто концептуально.

Результаты:

Полуприсоединиться

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

Фактически ничего не меняется в R.

R

df3 <- df1 %>%
    anti_join(df2, by = "join_column")

Питон

Подобно тому, что мы видели выше с анти-объединениями; однако в этом случае мы запрашиваем, где _merge равно «оба», что требует совпадения.

pd.merge(df1, df2['join_column'], on = "column_name", how = "left", indicator=True)\
.query('_merge == "both"')\
.drop('_merge', 1)

Заключение:

Мы быстро покрыли много земли. Когда дело доходит до объединения панд, шаги аналогичны dplyr в R. Мы изучили простые и эффективные переводы python для ключевых функций соединения в R, в частности, dplyr.

В частности, мы исследовали следующие типы соединений:

  • left_join
  • право_присоединиться
  • внутреннее соединение
  • внешнее_соединение
  • анти_присоединение
  • semi_join

Мы надеемся, что эта статья окажется полезной. Сообщите нам, какие альтернативные методы вы используете в Python вместо функции merge в pandas.