pandas: устройство, выборка и изменение таблиц

Выборка столбцов и строк: [], loc и iloc без цепочной индексации

Содержание курса

Чем отличаются loc и iloc

loc выбирает по меткам индекса, iloc — по номерам строк и столбцов, начиная с нуля. Возьмём одну таблицу для всех примеров урока:

Индексnamescorecity
aАнна85Москва
bБорис92Казань
cВера78Москва
dГригорий95Уфа
import pandas as pd
df = pd.DataFrame({
    'name': ['Анна', 'Борис', 'Вера', 'Григорий'],
    'score': [85, 92, 78, 95],
    'city': ['Москва', 'Казань', 'Москва', 'Уфа']
}, index=['a', 'b', 'c', 'd'])
print(df.loc['b', 'name'])
print(df.iloc[1, 0])
print(df.loc['a':'c', 'score'].tolist())
print(df.iloc[0:2, 1].tolist())

Результат:

Борис
Борис
[85, 92, 78]
[85, 92]
Что выбратьlociloc
Имя во второй строкеdf.loc['b', 'name']df.iloc[1, 0]
Первые три оценкиdf.loc['a':'c', 'score']df.iloc[0:3, 1]
Правая граница срезаМетка включаетсяПозиция не включается

Индекс здесь упорядочен. df.loc[1] ищет метку 1, которой нет, и выдаст KeyError. df.iloc[1] вернёт строку Бориса. Ниже на этих же данных разберём выбор столбцов и фильтрацию.

Самостоятельная практика. Закрепите разницу между метками и позициями: сравните границы срезов loc и iloc в задаче с проверкой кода. Решить задачу на срезы loc и iloc. Для последовательной практики выборки, очистки и объединения таблиц откройте бесплатный тренажёр NumPy и pandas. Пройти бесплатный тренажёр NumPy и pandas.

Выборка столбцов через [] — Series и DataFrame

Квадратные скобки после имени DataFrame работают по-разному в зависимости от того, что в них передать.

Если передать строку — одно имя столбца — получаешь Series:

import pandas as pd

df = pd.DataFrame({
    'name':  ['Анна', 'Борис', 'Вера', 'Григорий'],
    'score': [85, 92, 78, 95],
    'city':  ['Москва', 'Казань', 'Москва', 'Уфа']
}, index=['a', 'b', 'c', 'd'])

scores = df['score']
print(type(scores))   # <class 'pandas.core.series.Series'>
print(scores)
# a    85
# b    92
# c    78
# d    95

Series сохраняет тот же индекс, что и DataFrame. Это одномерная структура — удобно, когда нужно работать с одним признаком: считать статистику, строить маску, передавать в функцию.

Если передать список строк — получаешь DataFrame:

subset = df[['name', 'city']]
print(type(subset))   # <class 'pandas.core.frame.DataFrame'>
print(subset)
#       name    city
# a     Анна  Москва
# b    Борис  Казань
# c     Вера  Москва
# d  Григорий    Уфа

Обрати внимание на двойные скобки: внешние — синтаксис индексирования, внутренние — обычный список Python. Порядок столбцов в результате определяется порядком в списке, а не порядком в исходном DataFrame. То есть df[['city', 'name']] вернёт те же данные, но сначала city, потом name.

Когда что использовать:

  • df['col'] → Series, когда нужен один признак для вычислений или фильтрации.
  • df[['col1', 'col2']] → DataFrame, когда нужно сохранить табличную структуру или передать несколько столбцов дальше по пайплайну.

Главная ловушка здесь не в синтаксисе, а в ожиданиях: если написать df['score', 'city'] без вложенного списка — pandas попытается найти кортеж ('score', 'city') как метку столбца и бросит KeyError. Ошибка немного запутывает, поэтому лучше сразу запомнить: один столбец — строка, несколько — список внутри скобок.

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения. Преподаватель получит доступ к диалогу, когда вы попросите его помочь.

Проверка решения остаётся отдельным действием.