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

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

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

iloc — выборка по целочисленным позициям

iloc работает не с метками, а с порядковыми номерами строк и столбцов — теми самыми позициями, которые всегда начинаются с нуля независимо от того, что написано в индексе.

Это принципиально важно. В нашем DataFrame индекс — строки 'a', 'b', 'c', 'd'. Через loc к первой строке обращаешься как df.loc['a']. Через iloc — как df.iloc[0]. Если бы индекс был числовым, но начинался с 5, через iloc[0] всё равно получишь первую строку, а не ту, у которой метка 5.

Строка и ячейка по позиции

import pandas as pd

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

print(df.iloc[0])
# name    Анна
# score     85
# city    Москва
# Name: a, dtype: object

print(df.iloc[1, 0])   # 'Борис'

df.iloc[0] — первая строка, возвращает Series. df.iloc[1, 0] — строка с позицией 1, столбец с позицией 0 — скалярное значение. Столбцы тоже нумеруются с нуля: name → 0, score → 1, city → 2.

Срез по позициям

Здесь важное отличие от loc: правая граница среза не включается — точно как в обычном Python-срезе.

print(df.iloc[0:2])
#    name  score    city
# a  Анна     85  Москва
# b  Борис    92  Казань

df.iloc[0:2] возвращает строки с позициями 0 и 1 — строка с позицией 2 (метка 'c') не попадает в результат. Для сравнения, df.loc['a':'c'] включало бы 'c'. Разная семантика границ — самая частая точка путаницы при переключении между loc и iloc.

Список позиций

print(df.iloc[[0, 3]])
#        name  score  city
# a      Анна     85  Москва
# d  Григорий     95     Уфа

Список позиций позволяет выбирать строки в произвольном порядке — не обязательно подряд. Здесь берём первую и последнюю строку.

Когда нужен iloc, а не loc

iloc полезен тогда, когда метки индекса либо неизвестны, либо вообще не важны — например, при итерации с числовым шагом, при выборке первых N строк для быстрой проверки (df.iloc[:5]), или когда данные пришли из источника с нестандартным индексом. Если метки известны и осмысленны — удобнее loc.

Оба инструмента делают одно и то же с точки зрения результата, но опираются на разные системы координат: метки vs порядковые номера.