Конкатенация данных Pandas (concat / append)

Конкатенация данных соединяет несколько DataFrame или Series вместе по строкам или по столбцам.pd.concatявляется основной функцией конкатенации,appendявляется упрощённой версией (устаревшая, вместо неё рекомендуется concat).


Базовое использование concat

pd.concat()Можно конкатенировать несколько DataFrame или Series вдоль оси.

Конкатенация по строкам (вертикальное объединение)

Пример

import pandas as pd

# Создать два DataFrame
df1 = pd.DataFrame({
    "Имя": ["Чжан Сань", "Ли Сы"],
    "Возраст": [25, 30]
})

df2 = pd.DataFrame({
    "Имя": ["Ван У", "Чжао Лю"],
    "Возраст": [28, 35]
})

print("DataFrame 1:")
print(df1)
print()

print("DataFrame 2:")
print(df2)
print()

# Объединить по вертикали
result = pd.concat([df1, df2], ignore_index=True)
print("Результат объединения:")
print(result)

Объединение по столбцам (горизонтальное размещение)

Пример

import pandas as pd

df1 = pd.DataFrame({
    "Имя": ["Чжан Сань", "Ли Сы", "Ван У"]
})

df2 = pd.DataFrame({
    "Возраст": [25, 30, 28],
    "Город": ["Пекин", "Шанхай", "Гуанчжоу"]
})

# Горизонтальная конкатенация
result = pd.concat([df1, df2], axis=1)
print("Горизонтальная конкатенация:")
print(result)

axis=0Означает конкатенацию по строкам (добавление строк),axis=1Означает конкатенацию по столбцам (добавление столбцов).


Обработка дублирующихся индексов

ignore_index

Пример

import pandas as pd

df1 = pd.DataFrame({
    "Имя": ["Чжан Сань", "Ли Сы"],
    "Возраст": [25, 30]
}, index=[0, 1])

df2 = pd.DataFrame({
    "Имя": ["Ван У", "Чжао Лю"],
    "Возраст": [28, 35]
}, index=[0, 1])

# Сохранение исходных индексов по умолчанию
print("Сохранение исходных индексов:")
print(pd.concat([df1, df2]))
print()

# Игнорирование старых индексов и их пересоздание
print("Игнорирование исходных индексов:")
print(pd.concat([df1, df2], ignore_index=True))

Проверка дублирующихся ключей

Пример

import pandas as pd

df1 = pd.DataFrame({
    "A": [1, 2]
})

df2 = pd.DataFrame({
    "A": [3, 4]
})

# Проверить наличие дублирующихся ключей
print("Объект проверки:")
print(pd.concat([df1, df2], verify_integrity=True))

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

Параметр join

Пример

import pandas as pd

df1 = pd.DataFrame({
    "A": [1, 2, 3],
    "B": ["a", "b", "c"]
})

df2 = pd.DataFrame({
    "B": ["x", "y", "z"],
    "C": [10, 20, 30]
})

print("df1:")
print(df1)
print()

print("df2:")
print(df2)
print()

# Внешнее соединение (по умолчанию): сохранить все столбцы
print("Внешнее соединение (сохранить все столбцы):")
print(pd.concat([df1, df2], join="outer"))
print()

# Внутреннее соединение: оставить только общие столбцы
print("Внутреннее соединение (оставить только общие столбцы):")
print(pd.concat([df1, df2], join="inner"))

Добавить только новые столбцы

Пример

import pandas as pd

df1 = pd.DataFrame({
    "Имя": ["Чжан Сань", "Ли Сы"],
    "Возраст": [25, 30]
})

df2 = pd.DataFrame({
    "Город": ["Пекин", "Шанхай"]
})

# Добавить столбцы df2 в df1
result = pd.concat([df1, df2], axis=1)
print("Добавить только новые столбцы:")
print(result)

Параметр keys для создания иерархического индекса

Пример

import pandas as pd

df1 = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
df2 = pd.DataFrame({"A": [5, 6], "B": [7, 8]})
df3 = pd.DataFrame({"A": [9, 10], "B": [11, 12]})

# Использовать параметр keys для создания иерархического индекса
result = pd.concat([df1, df2, df3], keys=["Первый год", "Второй год", "Третий год"])
print("Конкатенация с иерархическим индексом:")
print(result)
print()

# Получить данные из иерархического индекса
print("Получить данные за второй год:")
print(result.loc["Second year"])

Практика: объединение данных за несколько месяцев

Пример

import pandas as pd

# Смоделировать данные о продажах за несколько месяцев
jan_sales = pd.DataFrame({
    "Month": ["2024-01"] * 3,
    "Продукт": ["A", "B", "C"],
    "Sales": [100, 150, 80]
})

feb_sales = pd.DataFrame({
    "Month": ["2024-02"] * 3,
    "Продукт": ["A", "B", "C"],
    "Sales": [120, 140, 90]
})

mar_sales = pd.DataFrame({
    "Month": ["2024-03"] * 3,
    "Продукт": ["A", "B", "C"],
    "Sales": [110, 160, 85]
})

# Объединить данные за первый квартал
quarterly = pd.concat([jan_sales, feb_sales, mar_sales], ignore_index=True)
print("Сводка за первый квартал:")
print(quarterly)
print()

# Агрегировать по месяцам
monthly_summary = quarterly.groupby("Month")["Sales"].sum()
print("Сводка продаж по месяцам:")
print(monthly_summary)

Метод append (устаревший)

DataFrame.append()Устарел в Pandas 2.0 и не рекомендуется. Пожалуйста, используйтеpd.concat()вместо этого.

# 不推荐(已废弃)
result = df1.append(df2)

# 推荐
result = pd.concat([df1, df2])

concatЯвляется стандартным методом для объединения данных в Pandas, с лучшей производительностью и более полной функциональностью.

Другие расширения