Pandas DataFrame: основы, фильтрация, группировка и объединение таблиц
Для кого эта статья:
- Аналитики данных и специалисты по обработке данных
- Python-разработчики, желающие улучшить навыки работы с данными
Студенты и начинающие специалисты, заинтересованные в обучении на курсах по аналитике данных
Библиотека pandas стала незаменимым инструментом в арсенале аналитиков данных и Python-разработчиков, а центральный компонент этой библиотеки — DataFrame — фактически превратился в стандарт для представления табличных данных. Освоение базовых операций с DataFrame открывает перед вами огромные возможности для манипуляции с данными — от простой фильтрации до сложной агрегации и объединения таблиц. В этой статье я рассмотрю фундаментальные приемы работы с DataFrame, которые позволят вам быстро и эффективно анализировать информацию даже при работе с большими и сложными наборами данных. 🐼
Хотите превратить теоретические знания о pandas в практические навыки анализа данных? Профессия аналитик данных от Skypro — это ваш путь к профессиональному владению инструментами обработки данных. Всего за 9 месяцев вы пройдете путь от новичка до специалиста, способного решать реальные бизнес-задачи с использованием Python и pandas. Преподаватели-практики помогут избежать типичных ошибок и быстрее освоить профессию.
Основы DataFrame: создание и структура данных в pandas
DataFrame — это двумерная структура данных в pandas, представляющая собой таблицу, состоящую из строк и столбцов. По сути, это аналог электронной таблицы Excel или таблицы SQL, но с гораздо более широкими возможностями обработки данных. Прежде чем приступать к сложным манипуляциям, необходимо понять, как создавать DataFrame и разобраться с его структурой.
Существует несколько способов создания DataFrame:
- Из словарей, списков или массивов numpy
- Из внешних источников (CSV, Excel, SQL и др.)
- Из другого DataFrame
Рассмотрим базовые примеры создания DataFrame:
import pandas as pd
import numpy as np
# Создание из словаря
data = {
'имя': ['Анна', 'Борис', 'Виктория', 'Григорий'],
'возраст': [25, 30, 22, 35],
'город': ['Москва', 'Санкт-Петербург', 'Казань', 'Новосибирск'],
'зарплата': [70000, 85000, 65000, 90000]
}
df = pd.DataFrame(data)
# Создание из списка словарей
data_list = [
{'имя': 'Анна', 'возраст': 25},
{'имя': 'Борис', 'возраст': 30},
{'имя': 'Виктория', 'возраст': 22}
]
df2 = pd.DataFrame(data_list)
# Создание из массива numpy
array = np.random.randn(3, 4) # 3 строки, 4 столбца
df3 = pd.DataFrame(array, columns=['A', 'B', 'C', 'D'])
# Загрузка данных из CSV-файла
df4 = pd.read_csv('data.csv')
После создания DataFrame мы можем изучить его структуру с помощью различных методов:
# Просмотр первых строк DataFrame
print(df.head())
# Информация о DataFrame
print(df.info())
# Статистика по числовым колонкам
print(df.describe())
# Размерность DataFrame
print(df.shape) # (строки, столбцы)
# Названия столбцов
print(df.columns)
# Типы данных
print(df.dtypes)
# Индексы
print(df.index)
Структура DataFrame включает в себя три ключевых компонента:
- Данные — сами значения, хранящиеся в DataFrame
- Индекс — метки строк, которые могут быть числовыми или строковыми
- Столбцы — метки столбцов, обычно представляющие разные переменные
Давайте сравним различные способы создания DataFrame:
| Метод создания | Преимущества | Недостатки | Типичное применение |
|---|---|---|---|
| Из словаря | Простота, наглядность структуры | Ограниченный объем данных | Небольшие наборы данных, тестирование |
| Из CSV/Excel | Работа с большими данными, стандартный формат | Необходимость обработки ошибок чтения | Реальные проекты, аналитика |
| Из SQL | Прямая интеграция с БД | Требует настройки подключения | Корпоративные приложения, бизнес-аналитика |
| Из массива numpy | Эффективная работа с числовыми данными | Сложнее работать с разнородными типами | Научные вычисления, машинное обучение |
Максим Соколов, Data Scientist
На своем опыте могу сказать, что понимание структуры DataFrame — один из самых важных навыков для аналитика данных. Недавно я работал над проектом для ритейл-компании, где требовалось анализировать продажи в разных магазинах. Сначала я получил данные из трех разных источников: системы учета продаж (CSV), базы данных клиентов (SQL) и таблицы Excel с информацией о товарах.
Благодаря универсальности pandas я смог быстро создать три DataFrame и начать с ними работать. Но самым сложным было понимание структуры данных — некоторые столбцы имели неочевидные типы (например, даты в формате строк), а индексация не всегда была логичной. Использование методов info() и describe() помогло мне быстро выявить эти особенности и скорректировать данные перед объединением.
Один полезный прием, который я использую постоянно: после загрузки данных сразу проверяю размерность через df.shape, чтобы убедиться, что все строки загружены, а затем df.dtypes, чтобы выявить неправильные типы данных. Это экономит много времени на этапе предобработки.

Выборка и фильтрация данных в pandas DataFrame
Возможность эффективно выбирать и фильтровать данные — одно из главных преимуществ pandas DataFrame. Эти операции позволяют извлекать именно те данные, которые необходимы для анализа, и являются фундаментом для более сложных манипуляций. 🔍
Существует несколько основных способов выборки данных в DataFrame:
- Выборка по метке (loc)
- Выборка по позиции (iloc)
- Выборка по условию
- Выборка с помощью query()
Рассмотрим каждый из этих методов подробнее:
# Создадим тестовый DataFrame
import pandas as pd
data = {
'имя': ['Анна', 'Борис', 'Виктория', 'Григорий', 'Дарья'],
'возраст': [25, 30, 22, 35, 28],
'город': ['Москва', 'Санкт-Петербург', 'Казань', 'Новосибирск', 'Москва'],
'отдел': ['Маркетинг', 'IT', 'Финансы', 'IT', 'Маркетинг'],
'зарплата': [70000, 85000, 65000, 90000, 72000]
}
df = pd.DataFrame(data)
df.set_index('имя', inplace=True) # Устанавливаем столбец 'имя' в качестве индекса
1. Выборка по метке с помощью loc
Метод loc позволяет выбирать данные на основе меток строк и столбцов:
# Выбрать одну строку по метке индекса
print(df.loc['Анна'])
# Выбрать несколько строк
print(df.loc[['Анна', 'Виктория']])
# Выбрать конкретный элемент (строка, столбец)
print(df.loc['Борис', 'возраст'])
# Выбрать строки и столбцы
print(df.loc[['Анна', 'Борис'], ['возраст', 'город']])
# Выбрать диапазон строк
print(df.loc['Анна':'Виктория'])
2. Выборка по позиции с помощью iloc
Метод iloc работает с числовыми индексами позиций:
# Выбрать первую строку
print(df.iloc[0])
# Выбрать несколько строк
print(df.iloc[[0, 2]])
# Выбрать конкретный элемент (строка, столбец)
print(df.iloc[1, 0]) # Элемент во второй строке, первом столбце
# Выбрать диапазон строк и столбцов
print(df.iloc[0:2, 1:3]) # Первые две строки, второй и третий столбцы
3. Фильтрация по условию
Одна из самых мощных возможностей pandas — фильтрация с использованием булевых масок:
# Фильтрация по одному условию
print(df[df['возраст'] > 25])
# Фильтрация по нескольким условиям
print(df[(df['возраст'] > 25) & (df['город'] == 'Москва')])
# Фильтрация с использованием оператора "или"
print(df[(df['отдел'] == 'IT') | (df['зарплата'] > 75000)])
# Проверка на принадлежность множеству значений
print(df[df['город'].isin(['Москва', 'Санкт-Петербург'])])
# Фильтрация с помощью строковых методов
print(df[df['город'].str.contains('Москва')])
4. Использование метода query()
Метод query() предоставляет более удобный синтаксис для сложных условий:
# Простой запрос
print(df.query('возраст > 25'))
# Запрос с несколькими условиями
print(df.query('возраст > 25 and город == "Москва"'))
# Использование переменных в запросе
min_salary = 70000
print(df.query('зарплата >= @min_salary'))
Методы выборки и фильтрации можно сравнить по эффективности и удобству использования:
| Метод | Преимущества | Недостатки | Рекомендуется для |
|---|---|---|---|
| loc | Интуитивное обращение по названиям | Может работать медленнее на больших данных | Когда известны метки строк/столбцов |
| iloc | Высокая производительность | Менее читаемый код (числа вместо названий) | Алгоритмической обработки, где важна скорость |
| Булевы маски | Гибкость в создании сложных условий | Может выглядеть громоздко | Сложных условий фильтрации |
| query() | Читаемость кода, компактность | Немного медленнее булевых масок | Удобочитаемых запросов средней сложности |
Выбор метода зависит от конкретной задачи, размера данных и предпочтений в стиле кода. В больших проектах часто используют комбинацию этих подходов.
Трансформация DataFrame: добавление и изменение строк и столбцов
Умение модифицировать существующие DataFrame — необходимый навык для эффективной работы с данными. Pandas предоставляет множество методов для добавления, изменения и удаления строк и столбцов. Рассмотрим основные операции трансформации DataFrame. ✨
Алексей Петров, Аналитик данных
Работая над проектом по оптимизации маркетинговых кампаний, я столкнулся с необходимостью трансформировать данные о клиентах из CRM-системы. Изначально датафрейм содержал лишь базовую информацию: ID клиента, дату регистрации и сумму первой покупки. Однако для анализа требовалось гораздо больше параметров.
Вместо того чтобы запрашивать новый выгруженный файл, я решил обогатить имеющиеся данные. Сначала добавил столбец с возрастом клиентской записи, используя простой код:
PythonСкопировать кодdf['возраст_записи'] = (pd.Timestamp.now() – df['дата_регистрации']).dt.daysЗатем мне потребовалось добавить категорию клиента на основе суммы первой покупки:
PythonСкопировать кодdef categorize(value): if value < 1000: return 'Эконом' elif value < 5000: return 'Стандарт' else: return 'Премиум' df['категория'] = df['сумма_первой_покупки'].apply(categorize)Самой сложной задачей было добавление данных о регионе по почтовому индексу. Для этого пришлось создать словарь соответствия индексов регионам и применить метод map(). Эта трансформация позволила сегментировать аудиторию и выявить, что клиенты из определенных регионов показывают лучший отклик на email-рассылки, чем на SMS-маркетинг.
Благодаря возможностям pandas по трансформации данных, мы смогли перераспределить маркетинговый бюджет и повысить конверсию кампаний на 18% без запроса дополнительных данных из IT-отдела.
Добавление и изменение столбцов
В pandas существует несколько способов добавления столбца в датафрейм:
import pandas as pd
import numpy as np
# Создадим тестовый DataFrame
data = {
'имя': ['Анна', 'Борис', 'Виктория', 'Григорий'],
'возраст': [25, 30, 22, 35],
'отдел': ['Маркетинг', 'IT', 'Финансы', 'IT']
}
df = pd.DataFrame(data)
# 1. Добавление столбца с константным значением
df['активный'] = True
# 2. Добавление столбца на основе вычислений из существующих столбцов
df['возраст_через_5_лет'] = df['возраст'] + 5
# 3. Добавление столбца с использованием списка/массива
df['стаж'] = [3, 7, 1, 10]
# 4. Добавление столбца с использованием функции apply
df['категория'] = df['возраст'].apply(lambda x: 'Молодой' if x < 25 else 'Опытный')
# 5. Добавление столбца на основе условий
df['зарплатная_категория'] = np.where(df['отдел'] == 'IT', 'Высокая', 'Средняя')
# 6. Добавление нескольких столбцов одновременно
df[['бонус_1', 'бонус_2']] = pd.DataFrame([[1000, 500], [1500, 700], [800, 300], [2000, 1000]])
# 7. Переименование столбцов
df = df.rename(columns={'возраст': 'полных_лет'})
# 8. Изменение порядка столбцов
df = df[['имя', 'полных_лет', 'отдел', 'активный', 'стаж', 'категория']]
Изменение существующих столбцов
# Изменение всех значений столбца
df['активный'] = False
# Изменение только определенных значений с использованием маски
df.loc[df['полных_лет'] > 30, 'активный'] = True
# Применение функции к столбцу для трансформации всех значений
df['имя'] = df['имя'].str.upper()
# Изменение типа данных столбца
df['стаж'] = df['стаж'].astype(float)
# Замена значений
df['отдел'] = df['отдел'].replace('Маркетинг', 'Реклама')
Добавление и изменение строк
Работа со строками в pandas требует особого внимания, поскольку DataFrame оптимизированы для работы со столбцами. Тем не менее, существует несколько способов добавить строку в dataframe:
# 1. Добавление строки с помощью метода loc
df.loc[len(df)] = ['ЕЛЕНА', 27, 'HR', True, 4, 'Опытный']
# 2. Добавление строки с помощью concat
новая_строка = pd.DataFrame([['МИХАИЛ', 40, 'Руководство', False, 15, 'Опытный']],
columns=df.columns)
df = pd.concat([df, новая_строка], ignore_index=True)
# 3. Добавление строк из другого DataFrame
другой_df = pd.DataFrame([
['ОЛЬГА', 23, 'Финансы', True, 2, 'Молодой'],
['ПАВЕЛ', 31, 'IT', True, 8, 'Опытный']
], columns=df.columns)
df = pd.concat([df, другой_df], ignore_index=True)
# 4. Изменение существующей строки
df.iloc[0] = ['АННА (изменено)', 26, 'Реклама', False, 3.5, 'Опытный']
# 5. Изменение конкретных значений в строке
df.loc[1, ['активный', 'стаж']] = [True, 7.5]
Удаление строк и столбцов
Иногда требуется удалить ненужные данные из DataFrame:
# Удаление столбца
df = df.drop('бонус_1', axis=1) # axis=1 указывает на столбец
# Или альтернативный способ
df.drop('бонус_2', axis=1, inplace=True) # inplace=True для изменения исходного DataFrame
# Удаление нескольких столбцов
df = df.drop(['зарплатная_категория', 'возраст_через_5_лет'], axis=1)
# Удаление строки по индексу
df = df.drop(0) # Удаление первой строки
# Или с использованием inplace
df.drop(1, inplace=True) # Удаление второй строки
# Удаление строк по условию
df = df[~(df['полных_лет'] > 30)] # Удаление строк, где возраст больше 30
# или
df = df.drop(df[df['полных_лет'] > 30].index)
При работе с добавлением строк и столбцов важно учитывать следующие моменты:
- При добавлении строк с использованием loc и concat может потребоваться перестройка индексов
- Добавление столбца в датафрейм pandas обычно выполняется быстрее, чем добавление строк
- Параметр inplace=True позволяет изменять DataFrame "на месте", без необходимости переприсваивания
- При массовых операциях лучше сначала подготовить все данные, а затем добавить их одной операцией, а не по одному
Агрегация и группировка данных для эффективного анализа
Агрегация и группировка данных — это мощные инструменты для анализа и обобщения информации в DataFrame. С их помощью можно вычислять статистические показатели по группам, выявлять тренды и паттерны, а также существенно уменьшать объем данных для дальнейшего анализа. 📊
В pandas основным методом для группировки является groupby(), который разделяет данные на группы по указанному признаку и позволяет применять к ним различные функции агрегации.
Основы группировки с groupby()
import pandas as pd
import numpy as np
# Создаем пример DataFrame с данными о продажах
data = {
'дата': pd.date_range(start='2023-01-01', periods=20),
'продукт': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A',
'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B'],
'регион': ['Восток', 'Запад', 'Восток', 'Запад', 'Восток', 'Запад', 'Восток', 'Запад', 'Восток', 'Запад',
'Восток', 'Запад', 'Восток', 'Запад', 'Восток', 'Запад', 'Восток', 'Запад', 'Восток', 'Запад'],
'менеджер': ['Иванов', 'Петров', 'Сидоров', 'Иванов', 'Петров', 'Сидоров', 'Петров', 'Иванов', 'Сидоров', 'Петров',
'Иванов', 'Сидоров', 'Петров', 'Иванов', 'Сидоров', 'Петров', 'Иванов', 'Сидоров', 'Петров', 'Иванов'],
'продажи': [100, 150, 200, 120, 160, 210, 90, 140, 180, 110,
130, 190, 105, 155, 205, 115, 165, 215, 95, 145],
'расходы': [80, 100, 120, 85, 105, 125, 75, 95, 115, 82,
90, 110, 83, 103, 123, 87, 107, 127, 78, 98]
}
df = pd.DataFrame(data)
df['прибыль'] = df['продажи'] – df['расходы']
# Группировка по одному столбцу
by_product = df.groupby('продукт')
# Получение статистики по группам
print(by_product['продажи'].mean()) # Средние продажи по продуктам
print(by_product['продажи'].sum()) # Сумма продаж по продуктам
print(by_product.size()) # Количество записей в каждой группе
# Группировка по нескольким столбцам
by_product_region = df.groupby(['продукт', 'регион'])
print(by_product_region['продажи'].sum())
Агрегирующие функции
С методом groupby() часто используются различные агрегирующие функции:
# Использование метода agg() для применения нескольких функций
agg_result = df.groupby('продукт').agg({
'продажи': ['sum', 'mean', 'max', 'min', 'count'],
'прибыль': ['sum', 'mean', 'max', 'min']
})
print(agg_result)
# Применение пользовательской функции
def profit_margin(x):
return (x['прибыль'].sum() / x['продажи'].sum()) * 100
margins = df.groupby('продукт').apply(profit_margin)
print(margins)
# Использование именованных агрегаций (pandas >= 0.25)
named_agg = df.groupby('продукт').agg(
total_sales=('продажи', 'sum'),
avg_sales=('продажи', 'mean'),
total_profit=('прибыль', 'sum'),
profit_margin=('прибыль', lambda x: (x.sum() / df.loc[x.index, 'продажи'].sum()) * 100)
)
print(named_agg)
Наиболее часто используемые агрегирующие функции:
- sum() — сумма значений
- mean() — среднее значение
- median() — медиана
- min(), max() — минимальное и максимальное значения
- count() — количество непустых значений
- std(), var() — стандартное отклонение и дисперсия
- first(), last() — первое и последнее значения в группе
- nunique() — количество уникальных значений
Продвинутые методы группировки
# Фильтрация групп на основе условия
filtered = df.groupby('продукт').filter(lambda x: x['продажи'].mean() > 120)
print(filtered)
# Трансформация данных с сохранением структуры исходного DataFrame
df['продажи_нормализованные'] = df.groupby('продукт')['продажи'].transform(
lambda x: (x – x.mean()) / x.std()
)
print(df[['продукт', 'продажи', 'продажи_нормализованные']])
# Оконные функции: накопительная сумма по группам
df['накопительные_продажи'] = df.sort_values('дата').groupby('продукт')['продажи'].cumsum()
print(df[['дата', 'продукт', 'продажи', 'накопительные_продажи']])
# Сдвиг данных внутри групп (лаги)
df['предыдущие_продажи'] = df.sort_values('дата').groupby('продукт')['продажи'].shift(1)
print(df[['дата', 'продукт', 'продажи', 'предыдущие_продажи']])
# Ранжирование внутри групп
df['ранг_по_продажам'] = df.groupby('продукт')['продажи'].rank(method='dense', ascending=False)
print(df[['продукт', 'продажи', 'ранг_по_продажам']])
Практические сценарии использования группировки и агрегации
Рассмотрим несколько реальных сценариев, где группировка и агрегация данных играют ключевую роль:
| Сценарий | Метод группировки | Применение | Пример кода |
|---|---|---|---|
| Анализ продаж по периодам | Группировка по временным периодам | Выявление сезонности, трендов | df.groupby(pd.Grouper(key='дата', freq='M'))['продажи'].sum() |
| Отчет по эффективности менеджеров | Группировка по сотрудникам | Оценка KPI, бонусы | df.groupby('менеджер').agg({'продажи': 'sum', 'прибыль': 'sum'}) |
| Анализ региональных показателей | Многоуровневая группировка | Сравнение регионов по продуктам | df.groupby(['регион', 'продукт'])['продажи'].sum().unstack() |
| Выявление аномалий | Группировка + фильтрация | Поиск выбросов, fraud-анализ | df.groupby('продукт').filter(lambda x: x['продажи'].std() > x['продажи'].mean() * 0.5) |
Группировка и агрегация данных в pandas особенно полезны при работе с большими объемами данных, так как позволяют свести множество строк к компактным сводным результатам, значительно ускоряя последующий анализ и визуализацию.
Важно помнить, что результат groupby() — это объект GroupBy, который не содержит данных, пока к нему не будет применен какой-либо метод агрегации. Этот подход называется "ленивые вычисления" и позволяет оптимизировать использование памяти.
Объединение DataFrame: методы merge, join и concat
Объединение таблиц данных — одна из самых востребованных операций в аналитике данных. Pandas предлагает три основных метода для объединения DataFrame: merge(), join() и concat(). Каждый из них имеет свои особенности и оптимальные сценарии применения. 🔄
Метод concat()
Метод concat() используется для объединения DataFrame по осям (строкам или столбцам). Это аналог операции Union в SQL.
import pandas as pd
import numpy as np
# Создаем два DataFrame для демонстрации
df1 = pd.DataFrame({
'ID': [1, 2, 3, 4],
'Name': ['Алексей', 'Мария', 'Иван', 'Елена'],
'Department': ['IT', 'HR', 'Finance', 'Marketing']
})
df2 = pd.DataFrame({
'ID': [5, 6, 7, 8],
'Name': ['Анна', 'Сергей', 'Дмитрий', 'Ольга'],
'Department': ['IT', 'Sales', 'IT', 'HR']
})
# Вертикальное объединение (по строкам)
result_rows = pd.concat([df1, df2])
print("Вертикальное объединение:")
print(result_rows)
# Вертикальное объединение с сбросом индекса
result_reset = pd.concat([df1, df2], ignore_index=True)
print("\nВертикальное объединение с новым индексом:")
print(result_reset)
# Создаем DataFrame с разными столбцами
df3 = pd.DataFrame({
'ID': [1, 2, 3, 4],
'Name': ['Алексей', 'Мария', 'Иван', 'Елена'],
'Salary': [70000, 65000, 80000, 75000]
})
df4 = pd.DataFrame({
'ID': [1, 2, 3, 4],
'Bonus': [10000, 5000, 15000, 7000],
'Experience': [5, 3, 7, 4]
})
# Горизонтальное объединение (по столбцам)
result_cols = pd.concat([df3, df4], axis=1)
print("\nГоризонтальное объединение:")
print(result_cols)
# Объединение с обработкой дубликатов столбцов
df5 = pd.DataFrame({
'ID': [1, 2, 3, 4],
'Name': ['А', 'Б', 'В', 'Г']
})
df6 = pd.DataFrame({
'ID': [3, 4, 5, 6],
'Name': ['В2', 'Г2', 'Д', 'Е']
})
# Объединение с проверкой совпадения индексов
result_outer = pd.concat([df5, df6], join='outer') # Включает все строки (значение по умолчанию)
print("\nОбъединение outer:")
print(result_outer)
result_inner = pd.concat([df5, df6], join='inner') # Только строки, присутствующие в обоих DataFrame
print("\nОбъединение inner:")
print(result_inner)
Метод merge()
Метод merge() используется для объединения DataFrame по ключевым столбцам, аналогично операциям JOIN в SQL.
# Создаем DataFrame с информацией о сотрудниках
employees = pd.DataFrame({
'employee_id': [1, 2, 3, 4, 5],
'name': ['Алексей', 'Мария', 'Иван', 'Елена', 'Дмитрий'],
'department_id': [101, 102, 101, 103, 102]
})
# Создаем DataFrame с информацией об отделах
departments = pd.DataFrame({
'department_id': [101, 102, 103, 104],
'department_name': ['IT', 'HR', 'Finance', 'Marketing'],
'location': ['Москва', 'Москва', 'Санкт-Петербург', 'Казань']
})
# Создаем DataFrame с зарплатами
salaries = pd.DataFrame({
'employee_id': [1, 2, 3, 5, 6],
'salary': [70000, 65000, 80000, 75000, 90000]
})
# Внутреннее объединение (inner join)
inner_merge = pd.merge(employees, departments, on='department_id')
print("Inner merge (сотрудники и отделы):")
print(inner_merge)
# Левое объединение (left join)
left_merge = pd.merge(employees, salaries, on='employee_id', how='left')
print("\nLeft merge (все сотрудники и их зарплаты, если есть):")
print(left_merge)
# Правое объединение (right join)
right_merge = pd.merge(employees, salaries, on='employee_id', how='right')
print("\nRight merge (все записи о зарплатах и сотрудники к ним):")
print(right_merge)
# Полное объединение (outer join)
outer_merge = pd.merge(employees, salaries, on='employee_id', how='outer')
print("\nOuter merge (все записи из обоих DataFrame):")
print(outer_merge)
# Объединение по разным именам столбцов
employees_alt = employees.rename(columns={'employee_id': 'emp_id'})
merge_diff_cols = pd.merge(
employees_alt, salaries,
left_on='emp_id', right_on='employee_id'
)
print("\nОбъединение по разным именам столбцов:")
print(merge_diff_cols)
# Объединение по нескольким столбцам
df7 = pd.DataFrame({
'key1': ['A', 'B', 'C', 'D'],
'key2': [1, 2, 3, 4],
'value1': [100, 200, 300, 400]
})
df8 = pd.DataFrame({
'key1': ['A', 'B', 'C', 'E'],
'key2': [1, 2, 3, 5],
'value2': [10, 20, 30, 50]
})
merge_multi_cols = pd.merge(df7, df8, on=['key1', 'key2'])
print("\nОбъединение по нескольким столбцам:")
print(merge_multi_cols)
Метод join()
Метод join() является упрощенной версией merge(), специально предназначенной для объединения по индексу.
# Создаем DataFrame с индексами
df9 = pd.DataFrame({
'A': [1, 2, 3, 4],
'B': ['a', 'b', 'c', 'd']
}, index=['I1', 'I2', 'I3', 'I4'])
df10 = pd.DataFrame({
'C': [5, 6, 7, 8],
'D': ['e', 'f', 'g', 'h']
}, index=['I1', 'I2', 'I3', 'I5'])
# Объединение по индексу
join_result = df9.join(df10)
print("Объединение по индексу (left join по умолчанию):")
print(join_result)
# Объединение с указанием типа объединения
join_inner = df9.join(df10, how='inner')
print("\nВнутреннее объединение по индексу:")
print(join_inner)
# Объединение нескольких DataFrame
df11 = pd.DataFrame({
'E': [9, 10, 11, 12],
'F': ['i', 'j', 'k', 'l']
}, index=['I1', 'I2', 'I6', 'I7'])
join_multiple = df9.join([df10, df11], how='outer')
print("\nОбъединение трех DataFrame:")
print(join_multiple)
Практические рекомендации по объединению DataFrame
Выбор правильного метода объединения:
- Используйте concat() для простого объединения DataFrame без связывания по ключам
- Применяйте merge() для объединения по одному или нескольким столбцам (как SQL JOIN)
- Выбирайте join() для быстрого объединения по индексу
Обработка дубликатов:
- При объединении может возникнуть проблема дублирования столбцов
- Используйте параметр suffixes в merge() и join() для добавления суффиксов к повторяющимся именам
- Например:
pd.merge(df1, df2, on='ID', suffixes=('_left', '_right'))
Проверка результатов:
- Всегда проверяйте размерность результирующего DataFrame (shape)
- Используйте indicator=True в merge() для добавления столбца, показывающего источник каждой строки
- Например:
pd.merge(df1, df2, how='outer', indicator=True)
Производительность:
- При работе с большими данными merge() может быть ресурсоемким
- Рассмотрите возможность предварительной фильтрации данных
- Используйте параметр copy=False для экономии памяти, если это безопасно
Объединение DataFrame — это мощный инструмент, который позволяет комбинировать данные из разных источников для создания целостного представления. Выбор правильного метода объединения зависит от структуры данных и требований к результату.
Освоив базовые операции с DataFrame в pandas, вы получили фундаментальный набор инструментов для эффективного анализа данных на Python. От создания и фильтрации до группировки и объединения — эти навыки позволяют трансформировать сырые данные в ценные аналитические выводы. Помните, что настоящее мастерство приходит с практикой: экспериментируйте с различными методами на реальных данных, комбинируйте изученные техники и не бойтесь исследовать документацию pandas для углубления знаний. Сложные аналитические задачи становятся намного проще, когда вы уверенно владеете инструментарием работы с DataFrame.
Читайте также
- Кластеризация данных бесплатно: 5 онлайн-инструментов для анализа
- Эволюция Big Data: от Hadoop до машинного обучения в аналитике
- Инструменты анализа рынка: выбор решений для бизнес-аналитики
- Автоматизация Trello: как сократить рутину и повысить продуктивность
- 25 книг для трансформации карьеры аналитика данных: от азов до эксперта
- Дорожная карта Data Scientist: поэтапный путь от новичка до эксперта
- Временные ряды: как превратить хаос данных в точные прогнозы
- Как узнать, какие SEO-инструменты используют ваши конкуренты
- Анализ временных рядов: 7 кейсов, изменивших мир бизнеса и науки
- Интеграция Google Forms и Maps API: визуализация геоданных