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