Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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 просто добавляет строки/колонки