Нашли ошибку?
базовыйpandas 3.0.6

loc, iloc, at, iat

Выбрать и изменить строки и столбцы — по меткам или по позициям, одним вызовом.

Нужно знать:Выбор столбцов

Содержание статьи

Коротко

  • df.loc[строки, столбцы] — по меткам индекса и именам столбцов. Срез меток включает конец.
  • df.iloc[строки, столбцы] — по позициям 0, 1, 2… Срез позиций, как в Python, конец не включает.
  • Вместо строк в loc можно передать булеву маску: df.loc[df["qty"] < 15, "price"].
  • Изменять значения — тоже через loc / iloc в одних скобках: df.loc[mask, "col"] = значение.
  • at / iat — одна ячейка по метке / позиции, быстрее loc / iloc.

Синтаксис

df.loc["метка"]                  # строка
df.loc["метка", "col"]           # ячейка
df.loc["a":"c", ["x", "y"]]      # срез меток (c входит) и список столбцов
df.loc[mask, "col"] = value      # запись по условию
df.iloc[0], df.iloc[1:3, :2]     # позиции (3 и 2 не входят)
df.at["метка", "col"], df.iat[0, 1]
loc iloc
что принимает метки, списки меток, маски целые позиции, списки позиций, маски
срез конец включается конец не включается
несуществующая метка при записи новая строка ошибка

Примеры

Данные для примеровиспользуются во всех примерах ниже
stock = pd.DataFrame(
    {"price": [180, 90, 220, 150], "qty": [12, 40, 7, 20], "shelf": ["A", "B", "A", "C"]},
    index=["латте", "чай", "раф", "какао"],
)
Строка по метке
stock.loc["чай"]                        # строка по метке — Series
Вывод
price    90
qty      40
shelf     B
Name: чай, dtype: object
Одна ячейка
stock.loc["раф", "price"]               # одна ячейка
Вывод
np.int64(220)
Срез меток и список столбцов
stock.loc["чай":"какао", ["price", "qty"]]   # срез по меткам ВКЛЮЧАЕТ конец
Вывод
       price  qty
чай       90   40
раф      220    7
какао    150   20
По позициям
print(stock.iloc[0])                    # первая строка
stock.iloc[1:3, :2]                     # строки 1–2, столбцы 0–1: конец не входит
Вывод
price    180
qty       12
shelf      A
Name: латте, dtype: object
     price  qty
чай     90   40
раф    220    7
Строки по условию
stock.loc[stock["qty"] < 15, "price"]   # строки по условию, один столбец
Вывод
латте    180
раф      220
Name: price, dtype: int64
Изменить значения
stock.loc["чай", "price"] = 95          # изменить ячейку
stock.loc[stock["shelf"] == "A", "qty"] += 5
stock
Вывод
       price  qty shelf
латте    180   17     A
чай       95   40     B
раф      220   12     A
какао    150   20     C
Одна ячейка: at и iat
print(stock.at["латте", "qty"])         # одна ячейка по метке — быстрее loc
stock.iat[0, 1]                         # одна ячейка по позиции
Вывод
12
np.int64(12)

Подводные камни

Срезы loc и iloc по-разному обращаются с концом

stock.loc["чай":"какао"] включает «какао», а stock.iloc[1:3] не включает позицию 3. Для меток «следующий после конца» не всегда определён, поэтому конец включают.

Запись в loc с новой меткой добавляет строку

Опечатка в метке при записи не даёт ошибку — появляется новая строка.

Новая метка
stock.loc["мокко"] = [200, 5, "B"]      # несуществующая метка — новая строка
stock
Вывод
       price  qty shelf
латте    180   12     A
чай       90   40     B
раф      220    7     A
какао    150   20     C
мокко    200    5     B

Метка в iloc

iloc со строкойошибка: TypeError
stock.iloc["чай"]                       # iloc понимает только позиции
Ошибка
TypeError: Cannot index by location index with a non-integer key