← Назад к вопросам

Что такое merge?

1.6 Junior🔥 231 комментариев
#Pandas и обработка данных

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

pandas merge(): объединение DataFrame'ов

merge() — это функция для объединения (JOIN) двух DataFrame'ов по одной или нескольким колонкам. Это аналог SQL JOIN'а в pandas.

Что такое merge()?

# Основной синтаксис
pd.merge(df1, df2, on='key', how='inner')

# df1, df2 — DataFrame'ы которые объединяю
# on — колонка для связи
# how — тип JOIN'а

Простой пример:

import pandas as pd

users = pd.DataFrame({
    'user_id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie']
})

orders = pd.DataFrame({
    'order_id': [101, 102, 103],
    'user_id': [1, 1, 2],
    'amount': [100, 200, 150]
})

# Объединяю по user_id
result = pd.merge(users, orders, on='user_id')

print(result)

Результат:

  user_id     name  order_id  amount
0        1    Alice       101     100
1        1    Alice       102     200
2        2      Bob       103     150

Типы merge (как SQL JOIN)

1. INNER JOIN (how='inner') — только совпадения

users = pd.DataFrame({
    'user_id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie']
})

orders = pd.DataFrame({
    'user_id': [1, 2],
    'amount': [100, 200]
})

result = pd.merge(users, orders, on='user_id', how='inner')

print(result)

Результат:

  user_id     name  amount
0        1    Alice     100
1        2      Bob     200

# Charlie (user_id=3) исчез, потому что нет заказов

2. LEFT JOIN (how='left') — все из левого DataFrame

result = pd.merge(users, orders, on='user_id', how='left')

print(result)

Результат:

  user_id     name  amount
0        1    Alice   100.0
1        2      Bob   200.0
2        3  Charlie     NaN

# Charlie есть, но amount = NaN (нет заказов)

3. RIGHT JOIN (how='right') — все из правого DataFrame

result = pd.merge(users, orders, on='user_id', how='right')

print(result)

Результат (если в orders есть user_id=4 которого нет в users):

  user_id     name  amount
0        1    Alice     100
1        2      Bob     200
2        4     NaN     300

# Пользователь с id=4 появляется, но name = NaN

4. OUTER JOIN (how='outer') — всё объединяю

result = pd.merge(users, orders, on='user_id', how='outer')

print(result)

Результат:

  user_id     name  amount
0        1    Alice   100.0
1        2      Bob   200.0
2        3  Charlie     NaN
3        4     NaN   300.0

# Charlie без заказов + заказ от неизвестного user_id

merge() на разные колонки

users = pd.DataFrame({
    'user_id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie']
})

payments = pd.DataFrame({
    'payer_id': [1, 2, 3],
    'amount': [100, 200, 150]
})

# Объединяю по разным колонкам
result = pd.merge(
    users,
    payments,
    left_on='user_id',
    right_on='payer_id'
)

print(result)

Результат:

  user_id     name  payer_id  amount
0        1    Alice         1     100
1        2      Bob         2     200
2        3  Charlie         3     150

merge() на несколько колонок

orders1 = pd.DataFrame({
    'customer_id': [1, 2, 1],
    'order_date': ['2024-01-15', '2024-01-15', '2024-01-20'],
    'amount': [100, 200, 150]
})

shipping = pd.DataFrame({
    'customer_id': [1, 2, 1],
    'order_date': ['2024-01-15', '2024-01-15', '2024-01-20'],
    'address': ['NYC', 'LA', 'NYC']
})

# Объединяю по двум колонкам
result = pd.merge(
    orders1,
    shipping,
    on=['customer_id', 'order_date']
)

print(result)

Результат:

  customer_id order_date  amount address
0            1 2024-01-15     100     NYC
1            2 2024-01-15     200      LA
2            1 2024-01-20     150     NYC

merge() с разными типами данных

Merge слева и справа:

df_left = pd.DataFrame({
    'key': ['A', 'B', 'C'],
    'value_left': [1, 2, 3]
})

df_right = pd.DataFrame({
    'key': ['A', 'B', 'D'],
    'value_right': [10, 20, 40]
})

# INNER — только A и B
inner = pd.merge(df_left, df_right, on='key', how='inner')

# LEFT — A, B, C
left = pd.merge(df_left, df_right, on='key', how='left')

# OUTER — A, B, C, D
outer = pd.merge(df_left, df_right, on='key', how='outer')

merge() vs join()

df1 = pd.DataFrame({'A': [1, 2, 3]}, index=['a', 'b', 'c'])
df2 = pd.DataFrame({'B': [4, 5, 6]}, index=['a', 'b', 'd'])

# Способ 1: merge (на значения колонок)
result = pd.merge(df1, df2, left_index=True, right_index=True, how='outer')

# Способ 2: join (на индексы)
result = df1.join(df2, how='outer')

# Результат одинаков, но join работает с индексами по умолчанию

merge() с aggfunc (агрегация при дублях)

df1 = pd.DataFrame({
    'key': [1, 1, 2],
    'value1': [10, 20, 30]
})

df2 = pd.DataFrame({
    'key': [1, 1, 2],
    'value2': [100, 200, 300]
})

# При merge дублируются строки
result = pd.merge(df1, df2, on='key')

print(result)

# Результат:
#   key  value1  value2
# 0   1      10     100
# 1   1      10     200
# 2   1      20     100
# 3   1      20     200  ← 4 строки! (2x2 комбинация)
# 4   2      30     300

Практические примеры для аналитики

Пример 1: Объединение данных о продажах и доставке

orders = pd.DataFrame({
    'order_id': [101, 102, 103, 104],
    'customer_id': [1, 2, 1, 3],
    'amount': [100, 200, 150, 300],
    'order_date': ['2024-01-15', '2024-01-15', '2024-01-20', '2024-01-20']
})

shipping = pd.DataFrame({
    'order_id': [101, 102, 103],
    'shipped_date': ['2024-01-16', '2024-01-16', '2024-01-22'],
    'tracking_number': ['TRK001', 'TRK002', 'TRK003']
})

# LEFT JOIN потому что все заказы важны, даже не отправленные
result = pd.merge(
    orders,
    shipping,
    on='order_id',
    how='left'
)

print(result)

Результат:

  order_id  customer_id  amount order_date shipped_date tracking_number
0       101            1     100 2024-01-15   2024-01-16          TRK001
1       102            2     200 2024-01-15   2024-01-16          TRK002
2       103            1     150 2024-01-20   2024-01-22          TRK003
3       104            3     300 2024-01-20          NaN             NaN

# Заказ 104 не отправлен (NaN в shipping колонках)

Пример 2: Объединение исторических данных

# Текущие цены
current_prices = pd.DataFrame({
    'product_id': [1, 2, 3],
    'current_price': [100, 200, 150]
})

# Исторические цены
old_prices = pd.DataFrame({
    'product_id': [1, 2, 3],
    'old_price': [80, 180, 120]
})

# INNER JOIN
result = pd.merge(current_prices, old_prices, on='product_id')

# Считаю изменение цены
result['price_change'] = result['current_price'] - result['old_price']
result['pct_change'] = (result['price_change'] / result['old_price'] * 100).round(1)

print(result)

Результат:

  product_id  current_price  old_price  price_change  pct_change
0           1            100         80            20        25.0
1           2            200        180            20        11.1
2           3            150        120            30        25.0

Пример 3: Merge с aggregate функций

users = pd.DataFrame({
    'user_id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie']
})

orders = pd.DataFrame({
    'user_id': [1, 1, 2, 2, 2, 3],
    'amount': [100, 200, 50, 75, 125, 300]
})

# Агрегирую заказы по пользователю
user_stats = orders.groupby('user_id').agg({
    'amount': ['sum', 'count', 'mean']
}).reset_index()

user_stats.columns = ['user_id', 'total_amount', 'order_count', 'avg_amount']

# Merge с user'ами
result = pd.merge(users, user_stats, on='user_id')

print(result)

Результат:

  user_id     name  total_amount  order_count  avg_amount
0        1    Alice           300            2      150.0
1        2      Bob           250            3       83.3
2        3  Charlie           300            1      300.0

merge() vs concat()

df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})

# merge — для объединения по колонкам (как SQL JOIN)
result_merge = pd.merge(df1, df2, left_index=True, right_index=True)

# concat — для объединения строк или колонок
result_concat = pd.concat([df1, df2], axis=0)  # Вертикально
result_concat = pd.concat([df1, df2], axis=1)  # Горизонтально

Когда использовать:

  • merge — для JOIN'а на колонкам (как SQL)
  • concat — для простого объединения строк/колонок
  • join — для объединения по индексам

Вывод

merge() — это SQL JOIN в pandas.

Основные параметры:

  • on — колонка для объединения
  • left_on / right_on — разные колонки
  • how — тип JOIN'а (inner, left, right, outer)
  • suffixes — суффиксы для одинаковых имён колонок

Практическое правило: Всегда используй LEFT JOIN в аналитике, чтобы не потерять важные данные.

Запомни:

  • merge объединяет на ЗНАЧЕНИЯХ колонок
  • join объединяет на ИНДЕКСАХ
  • concat просто добавляет строки/колонки
Что такое merge? | PrepBro