Индекс Pandas

Index — это основной компонент структур данных Pandas, определяющий, как данные организованы и доступны. Pandas поддерживает несколько типов индексов — от простого RangeIndex до сложного MultiIndex. В этом разделе подробно рассматривается использование различных типов индексов.


Основные понятия Index

Индекс похож на первичный ключ базы данных или номер строки в Excel и используется для уникальной идентификации каждой строки данных. DataFrame имеет индекс строк (index) и индекс столбцов (columns).

Пример

import pandas as pd

# Создаём простой DataFrame (по умолчанию используется RangeIndex)
df = pd.DataFrame({
    "Имя": ["Чжан Сань", "Ли Сы", "Ван У"],
    "Возраст": [25, 30, 28],
    "Город": ["Пекин", "Шанхай", "Гуанчжоу"]
})

print("Информация о DataFrame:")
print(f"Индекс строк: {df.index.tolist()}")
print(f"Индекс столбцов: {df.columns.tolist()}")
print("\n"Данные:")
print(df)

RangeIndex

RangeIndex — это целочисленный индекс по умолчанию, аналогичныйrange(n), увеличивающийся начиная с 0.

Создание и использование

Пример

import pandas as pd

# Создание RangeIndex
idx = pd.RangeIndex(start=0, stop=10, step=1)
print(f"RangeIndex: {idx}")
print(f"Тип: {type(idx)}")

# DataFrame по умолчанию использует RangeIndex
df = pd.DataFrame({"A": [1, 2, 3]}, index=range(3))
print(f"\n"Тип индекса по умолчанию: {type(df.index)}")

# Сброс индекса также возвращает RangeIndex
df_reset = df.reset_index()
print(f"Тип индекса после сброса: {type(df_reset.index)}")

Особенности RangeIndex

  • Минимальное использование памяти
  • Поддерживает доступ по целочисленной позиции по умолчанию
  • Простое преобразование в другие типы индексов и обратно

Преобразование типов индекса

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

Преобразование в другие типы Index

Пример

import pandas as pd

# Создайте пример DataFrame
df = pd.DataFrame({"Value": [1, 2, 3, 4]}, index=[10, 20, 30, 40])

# Преобразовать в тип Index
print("Исходный индекс:", df.index)
print("Тип Index:", type(df.index))

# Преобразовать в список
idx_list = df.index.tolist()
print(f"Преобразовано в список: {idx_list}")

# Преобразовать в массив NumPy
idx_array = df.index.values
print(f"Преобразовано в массив: {idx_array}")

# Сбросить индекс к RangeIndex
df = df.reset_index(drop=True)
print(f"Сброшено до RangeIndex: {df.index}")

Установка пользовательского индекса

Вы можете использовать столбец DataFrame в качестве индекса строк.

Использование set_index

Пример

import pandas as pd

# Создать DataFrame
df = pd.DataFrame({
    "Student ID": ["S001", "S002", "S003", "S004"],
    "Имя": ["Чжан Сань", "Ли Сы", "Ван У", "Чжао Лю"],
    "Score": [85, 92, 78, 90]
})

print("Исходные данные:")
print(df)
print()

# Установить столбец "Student ID" как индекс
df1 = df.set_index("Student ID")
print("Student ID установлен как индекс:")
print(df1)
print()

# Установить несколько индексов (это создаёт MultiIndex)
df2 = df.set_index(["Student ID", "Name"])
print("Установить несколько индексов:")
print(df2)

Создание с параметром index

Пример

import pandas as pd

# Укажите индекс напрямую при создании DataFrame
df = pd.DataFrame(
    {"Имя": ["Чжан Сань", "Ли Сы", "Ван У"], "Возраст": [25, 30, 28]},
    index=["A001", "A002", "A003"]
)

print(df)
print(f"\n"Индекс: {df.index.tolist()}")

# Использовать DatetimeIndex
dates = pd.date_range("2024-01-01", periods=3, freq="D")
df_date = pd.DataFrame({"Значение": [100, 200, 300]}, index=dates)

print("\n"Использование индекса дат:")
print(df_date)
print(f"Тип индекса: {type(df_date.index)}")

Операции с индексом

Сброс индекса

Пример

import pandas as pd

# Создать DataFrame с пользовательским индексом
df = pd.DataFrame(
    {"Имя": ["Чжан Сан", "Ли Сы"], "Оценка": [85, 92]},
    index=["A001", "A002"]
)

# Сбросить индекс до стандартного RangeIndex
df_reset = df.reset_index()
print("Сброс индекса:")
print(df_reset)

# параметр drop: удалять ли исходный столбец индекса
df_reset2 = df.reset_index(drop=True)
print("\n"Сброс и удаление исходного индекса:")
print(df_reset2)

Переиндексация

Пример

import pandas as pd

# Создать DataFrame
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}, index=[1, 2, 3])

# Переиндексировать (изменить порядок индекса)
df_reindex = df.reindex([1, 2, 3, 4, 5])
print("Переиндексировано (пропущенные значения заполнены NaN):")
print(df_reindex)

# Используйте fill_value для заполнения пропущенных значений
df_reindex2 = df.reindex([1, 2, 3, 4, 5], fill_value=0)
print("\n"Переиндексировано (заполнено 0):")
print(df_reindex2)

Операции с уровнями индекса

Пример

import pandas as pd

# Создать DataFrame с MultiIndex
df = pd.DataFrame({
    "Китайский": [85, 92, 78],
    "Математика": [90, 88, 95]
}, index=pd.MultiIndex.from_tuples(
    [("10 класс", "Класс A"), ("10 класс", "Класс B"), ("11 класс", "Класс A")],
    names=["Grade", "Class"]
))

print("DataFrame с MultiIndex:")
print(df)
print()

# Получить внешний индекс
print(f"Внешний индекс (grade): {df.index.get_level_values(0).tolist()}")
print(f"Внутренний индекс (class): {df.index.get_level_values(1).tolist()}")

Атрибуты и методы индекса

Атрибут/Метод Описание Пример
index.tolist() Преобразовать в список Python df.index.tolist()
index.values Преобразовать в массив NumPy df.index.values
index.unique() Получить уникальные значения df.index.unique()
index.is_unique Проверить, является ли индекс уникальным df.index.is_unique
index.astype() Преобразовать тип индекса df.index.astype(str)

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

Пример

import pandas as pd

# Создайте пример DataFrame
df = pd.DataFrame(
    {"Значение": [1, 2, 3, 4]},
    index=["a", "b", "c", "d"]
)

# Просмотр атрибутов индекса
print(f"Индекс уникален: {df.index.is_unique}")
print(f"Длина индекса: {len(df.index)}")
print(f"Тип данных индекса: {df.index.dtype}")

# Преобразовать в строковый тип
str_index = df.index.astype(str)
print(f"Тип после преобразования: {str_index.dtype}")

Практика: использование индекса для повышения эффективности запросов

В реальном анализе данных установка разумного индекса может значительно повысить эффективность запросов.

Пример

import pandas as pd

# Смоделировать бизнес-данные
df = pd.DataFrame({
    "Order ID": range(1000),
    "Customer ID": [f"C{i%100:03d}" for i in range(1000)],
    "Product": [f"Product{i%20}" for i in range(1000)],
    "Amount": [round(i * 1.5, 2) for i in range(1000)]
})

# Установите часто запрашиваемые столбцы в качестве индекса
df_indexed = df.set_index(["Customer ID", "Product"])

# Использование индекса для быстрого запроса (аналогично запросу по первичному ключу в базе данных)
result = df_indexed.loc[("C001", "Product 1")]
print("Запрос товаров одного клиента с использованием индекса:")
print(result)

# Группировка по Customer ID для статистики
print("\nОбщие расходы каждого клиента:")
customer_total = df.groupby("Customer ID")["Amount"].sum()
print(customer_total.head(10))

Примечания

1. Значения индекса должны быть уникальными

Если значения индекса не уникальны, некоторые операции (такие какloclookup) вернут несколько совпадающих строк.

2. Индексы могут иметь имена

Присвоение имени индексу может улучшить читаемость кода:df.index.name = "学号"

3. Индексы следуют за операциями с данными

Такие операции, как срезы и фильтрация, сохраняют индекс; нужно обращать внимание на соответствие между индексом и данными.

Индекс — ключ к производительности Pandas. Назначение часто запрашиваемых столбцов индексами может значительно повысить скорость поиска, но слишком много индексов увеличит накладные расходы на запись, поэтому необходим компромисс.

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