Выборка столбцов и строк: [], loc и iloc без цепочной индексации
Содержание курса
Чем отличаются loc и iloc
loc выбирает по меткам индекса, iloc — по номерам строк и столбцов, начиная с нуля. Возьмём одну таблицу для всех примеров урока:
| Индекс | name | score | city |
|---|---|---|---|
| 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]
| Что выбрать | loc | iloc |
|---|---|---|
| Имя во второй строке | 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. Ошибка немного запутывает, поэтому лучше сразу запомнить: один столбец — строка, несколько — список внутри скобок.
