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

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

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

После того как в прошлом уроке DataFrame уже загружен с нужными типами, следующий шаг — уметь из него вытаскивать именно то, что нужно: конкретный столбец, набор столбцов, отдельные строки или ячейки. Начнём с самого очевидного инструмента — оператора [].

Выборка столбцов через [] — 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. Ошибка немного запутывает, поэтому лучше сразу запомнить: один столбец — строка, несколько — список внутри скобок.