Pandas DataFrame: основы, фильтрация, группировка и объединение таблиц

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Аналитики данных и специалисты по обработке данных
  • 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:

Python
Скопировать код
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 мы можем изучить его структуру с помощью различных методов:

Python
Скопировать код
# Просмотр первых строк 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 включает в себя три ключевых компонента:

  1. Данные — сами значения, хранящиеся в DataFrame
  2. Индекс — метки строк, которые могут быть числовыми или строковыми
  3. Столбцы — метки столбцов, обычно представляющие разные переменные

Давайте сравним различные способы создания DataFrame:

Метод создания Преимущества Недостатки Типичное применение
Из словаря Простота, наглядность структуры Ограниченный объем данных Небольшие наборы данных, тестирование
Из CSV/Excel Работа с большими данными, стандартный формат Необходимость обработки ошибок чтения Реальные проекты, аналитика
Из SQL Прямая интеграция с БД Требует настройки подключения Корпоративные приложения, бизнес-аналитика
Из массива numpy Эффективная работа с числовыми данными Сложнее работать с разнородными типами Научные вычисления, машинное обучение

Максим Соколов, Data Scientist

На своем опыте могу сказать, что понимание структуры DataFrame — один из самых важных навыков для аналитика данных. Недавно я работал над проектом для ритейл-компании, где требовалось анализировать продажи в разных магазинах. Сначала я получил данные из трех разных источников: системы учета продаж (CSV), базы данных клиентов (SQL) и таблицы Excel с информацией о товарах.

Благодаря универсальности pandas я смог быстро создать три DataFrame и начать с ними работать. Но самым сложным было понимание структуры данных — некоторые столбцы имели неочевидные типы (например, даты в формате строк), а индексация не всегда была логичной. Использование методов info() и describe() помогло мне быстро выявить эти особенности и скорректировать данные перед объединением.

Один полезный прием, который я использую постоянно: после загрузки данных сразу проверяю размерность через df.shape, чтобы убедиться, что все строки загружены, а затем df.dtypes, чтобы выявить неправильные типы данных. Это экономит много времени на этапе предобработки.

Пошаговый план для смены профессии

Выборка и фильтрация данных в pandas DataFrame

Возможность эффективно выбирать и фильтровать данные — одно из главных преимуществ pandas DataFrame. Эти операции позволяют извлекать именно те данные, которые необходимы для анализа, и являются фундаментом для более сложных манипуляций. 🔍

Существует несколько основных способов выборки данных в DataFrame:

  1. Выборка по метке (loc)
  2. Выборка по позиции (iloc)
  3. Выборка по условию
  4. Выборка с помощью query()

Рассмотрим каждый из этих методов подробнее:

Python
Скопировать код
# Создадим тестовый 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 позволяет выбирать данные на основе меток строк и столбцов:

Python
Скопировать код
# Выбрать одну строку по метке индекса
print(df.loc['Анна'])

# Выбрать несколько строк
print(df.loc[['Анна', 'Виктория']])

# Выбрать конкретный элемент (строка, столбец)
print(df.loc['Борис', 'возраст'])

# Выбрать строки и столбцы
print(df.loc[['Анна', 'Борис'], ['возраст', 'город']])

# Выбрать диапазон строк
print(df.loc['Анна':'Виктория'])

2. Выборка по позиции с помощью iloc

Метод iloc работает с числовыми индексами позиций:

Python
Скопировать код
# Выбрать первую строку
print(df.iloc[0])

# Выбрать несколько строк
print(df.iloc[[0, 2]])

# Выбрать конкретный элемент (строка, столбец)
print(df.iloc[1, 0]) # Элемент во второй строке, первом столбце

# Выбрать диапазон строк и столбцов
print(df.iloc[0:2, 1:3]) # Первые две строки, второй и третий столбцы

3. Фильтрация по условию

Одна из самых мощных возможностей pandas — фильтрация с использованием булевых масок:

Python
Скопировать код
# Фильтрация по одному условию
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() предоставляет более удобный синтаксис для сложных условий:

Python
Скопировать код
# Простой запрос
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 существует несколько способов добавления столбца в датафрейм:

Python
Скопировать код
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[['имя', 'полных_лет', 'отдел', 'активный', 'стаж', 'категория']]

Изменение существующих столбцов

Python
Скопировать код
# Изменение всех значений столбца
df['активный'] = False

# Изменение только определенных значений с использованием маски
df.loc[df['полных_лет'] > 30, 'активный'] = True

# Применение функции к столбцу для трансформации всех значений
df['имя'] = df['имя'].str.upper()

# Изменение типа данных столбца
df['стаж'] = df['стаж'].astype(float)

# Замена значений
df['отдел'] = df['отдел'].replace('Маркетинг', 'Реклама')

Добавление и изменение строк

Работа со строками в pandas требует особого внимания, поскольку DataFrame оптимизированы для работы со столбцами. Тем не менее, существует несколько способов добавить строку в dataframe:

Python
Скопировать код
# 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:

Python
Скопировать код
# Удаление столбца
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()

Python
Скопировать код
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() часто используются различные агрегирующие функции:

Python
Скопировать код
# Использование метода 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() — количество уникальных значений

Продвинутые методы группировки

Python
Скопировать код
# Фильтрация групп на основе условия
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.

Python
Скопировать код
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.

Python
Скопировать код
# Создаем 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(), специально предназначенной для объединения по индексу.

Python
Скопировать код
# Создаем 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

  1. Выбор правильного метода объединения:

    • Используйте concat() для простого объединения DataFrame без связывания по ключам
    • Применяйте merge() для объединения по одному или нескольким столбцам (как SQL JOIN)
    • Выбирайте join() для быстрого объединения по индексу
  2. Обработка дубликатов:

    • При объединении может возникнуть проблема дублирования столбцов
    • Используйте параметр suffixes в merge() и join() для добавления суффиксов к повторяющимся именам
    • Например: pd.merge(df1, df2, on='ID', suffixes=('_left', '_right'))
  3. Проверка результатов:

    • Всегда проверяйте размерность результирующего DataFrame (shape)
    • Используйте indicator=True в merge() для добавления столбца, показывающего источник каждой строки
    • Например: pd.merge(df1, df2, how='outer', indicator=True)
  4. Производительность:

    • При работе с большими данными merge() может быть ресурсоемким
    • Рассмотрите возможность предварительной фильтрации данных
    • Используйте параметр copy=False для экономии памяти, если это безопасно

Объединение DataFrame — это мощный инструмент, который позволяет комбинировать данные из разных источников для создания целостного представления. Выбор правильного метода объединения зависит от структуры данных и требований к результату.

Освоив базовые операции с DataFrame в pandas, вы получили фундаментальный набор инструментов для эффективного анализа данных на Python. От создания и фильтрации до группировки и объединения — эти навыки позволяют трансформировать сырые данные в ценные аналитические выводы. Помните, что настоящее мастерство приходит с практикой: экспериментируйте с различными методами на реальных данных, комбинируйте изученные техники и не бойтесь исследовать документацию pandas для углубления знаний. Сложные аналитические задачи становятся намного проще, когда вы уверенно владеете инструментарием работы с DataFrame.

Читайте также

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Что такое DataFrame в pandas?
1 / 5

Загрузка...