Объединяем две Series в DataFrame в pandas: сохраняем индексы

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если перед вами стоит задача объединить два Series-объекта pandas в DataFrame, существуют два способа это сделать: добавить их в словарь, указав имена столбцов, или использовать функцию pd.concat для горизонтального объединения (axis=1). Ниже приведены примеры кода для обеих методик:

Python
Скопировать код
import pandas as pd

# Предположим, что у нас есть два объекта Series: series1 и series2
# Способ 1: создание DataFrame с помощью словаря
df = pd.DataFrame({'column1': series1, 'column2': series2})

# Способ 2: создание DataFrame с помощью pd.concat
df = pd.concat([series1, series2], axis=1, keys=['column1', 'column2'])

В результате мы получаем DataFrame, в котором 'series1' превращается в 'column1', а 'series2' — в 'column2'.

Кинга Идем в IT: пошаговый план для смены профессии

О работе с индексами и именами столбцов

При объединении Series-объектов в DataFrame, непереоценено сохранить исходные индексы, чтобы не терять данные. Здесь на помощь придёт функция pd.concat, позволяющая обрабатывать и несовпадающие индексы без потери информации. В этом контексте особую важность принимает параметр axis: при значении 0 объединение происходит по индексам (то есть по строкам), а при значении 1 — по столбцам.

Если вас беспокоит потеря имен столбцов, не стоит волноваться: атрибуты name объектов Series автоматически становятся названиями столбцов в новом DataFrame. Если же имен нет, можно использовать параметр keys в функции pd.concat для их установки.

Python
Скопировать код
# Устанавливаем имена Series, благодаря чему они станут названиями столбцов в DataFrame
series1.name, series2.name = 'column1', 'column2'
df = pd.concat([series1, series2], axis=1)

Вы также можете объединить больше двух Series с использованием pd.concat. Но следует помнить о том, что разнородные индексы могут вызвать появление в DataFrame значений NaN.

Сохранение и восстановление индексов

Для того чтобы исходные индексы стали дополнительным столбцом DataFrame, используйте метод reset_index после объединения с помощью pd.concat.

Python
Скопировать код
# Возвращаем исходные индексы в виде отдельного столбца
df = pd.concat([series1, series2], axis=1).reset_index()

Подход для ранних версий pandas

Если вы используете версию pandas ниже 0.23, можно применить такую стратегию: преобразуйте Series в DataFrame функцией to_frame() и затем соедините их при помощи метода join.

Python
Скопировать код
# Преобразуем Series в DataFrame и соединяем их
df1, df2 = series1.to_frame('column1'), series2.to_frame('column2')
df = df1.join(df2)  # по умолчанию используется outer join

Удостоверьтесь, что индексы ваших Series совпадают, иначе при выполнении операции join может появиться ряд избыточных строк.

Создание DataFrame без лишних манипуляций

Если вам нежелательно производить конкатенацию, вы можете создать DataFrame прямо из словаря, содержащего Series-объекты.

Python
Скопировать код
# Создаём DataFrame непосредственно из объектов Series
df = pd.DataFrame({'column1': series1, 'column2': series2})

Такой подход позволяет избежать несоответствия данных, поскольку pandas правильно обрабатывает индексы Series.

Контроль за дубликатами при несовпадении индексов

Будьте внимательны при объединении Series с разными наборами индексов: это может привести к дублированию данных. В такой ситуации вам пригодится метод drop_duplicates для удаления повторяющихся записей.

Визуализация

Для наглядности можно представить две реки, впадающие в одно большое озеро:

Markdown
Скопировать код
Река 1 (🏞️): [Рыба 🐟, Водоросли 🌿, Вода 💧]
Река 2 (🏞️): [Лягушка 🐸, Лотос 🌸, Вода 💧]

Мы соединяем их в Озеро DataFrame (🏞️🔄🏞️):

Python
Скопировать код
Озеро DataFrame = pd.DataFrame({'Река 1': Река 1, 'Река 2': Река 2})

В результате мы имеем идиллическую картину Экосистемы Озера:

Markdown
Скопировать код
🏞️🔄🏞️: 
| Река 1 | Река 2 |
| ------- | ------- |
| 🐟      | 🐸      |
| 🌿      | 🌸      |
| 💧      | 💧      |

Подтверждение корректности результата

Всегда точно знайте, как представляют себя первые пять строк нового DataFrame. Это достигается путем использования метода df.head(). Это поможет убедиться в корректности процедуры объединения данных и отсутствии ошибок.

Полезные рекомендации

  • Если требуется переименовать столбцы, используйте метод .rename(columns={'old_name': 'new_name'}), чтобы изменить имена на ходу.
  • Знайте и понимайте особенности автоматического выравнивания данных pandas при создании DataFrame из словаря Series.

Тонкости и особенные случаи

  • Будьте осторожны при работе с индексами различной длины: функция pd.concat автоматически дополняет недостающие значения NaN.
  • Избегайте дублирования данных из-за неуникальных индексов в объединяемых Series.
  • Обратите внимание на многоуровневые индексы (MultiIndex), если таковые присутствуют в Series. Функция pd.concat сохраняет структуру MultiIndex.

Полезные материалы

  1. Присоединение, объединение, конкатенация и сравнение — документация pandas 2.2.0 — официальное руководство по объединению данных в pandas.
  2. DataFrame pandas: Упростите работу с данными – Real Python — подробный гид по использованию DataFrame в pandas.
  3. pandas.concat — документация pandas 2.2.0 — ссылка на документацию по функции конкатенации данных в pandas.
  4. Series — документация pandas 2.2.0 — подробная информация о Series-объектах в pandas.
  5. Python – Объединение двух Series-объектов в DataFrame в pandas – Stack Overflow — обсуждение данной темы на Stack Overflow с примерами.
  6. DataFrame в pandas на Python – GeeksforGeeks — простое введение в работу с DataFrame в pandas.
  7. DataFrame pandas – W3Schools — учебник по созданию и манипуляции DataFrame, включая работу с Series.