Индексация и срезы в Pandas

В Pandas есть несколько способов выбрать данные: по позиции, по метке, через маску. Понимание разницы между ними экономит часы отладки. Запомните правило: .loc — по меткам, .iloc — по позициям, обычные скобки [] — «как удобно», но с подводными камнями.

Когда использовать

  • .loc — когда работаете с подписанным индексом (датой, ID).

  • .iloc — когда нужны строки по номеру (первые 10, последние 5).

  • Маска — для условий («температура > 30»).

Пример 1. Один столбец

import pandas as pd

df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
print(df["a"])

Output:

0    1
1    2
2    3
Name: a, dtype: int64

Пример 2. .loc по метке

import pandas as pd

df = pd.DataFrame({"v": [10, 20, 30]}, index=["a", "b", "c"])
print(df.loc["b", "v"])
print(df.loc["a":"b"])

Output:

20
   v
a  10
b  20

Внимание: .loc включает обе границы.

Пример 3. .iloc по позиции

import pandas as pd

df = pd.DataFrame({"v": [10, 20, 30]}, index=["a", "b", "c"])
print(df.iloc[1])
print(df.iloc[0:2])

Output:

v    20
Name: b, dtype: int64
   v
a  10
b  20

.iloc[0:2] не включает правую границу — как обычные срезы Python.

Пример 4. .at и .iat для одной ячейки

import pandas as pd

df = pd.DataFrame({"v": [10, 20]}, index=["a", "b"])
print(df.at["a", "v"])
print(df.iat[1, 0])

Output:

10
20

.at/.iat быстрее .loc/.iloc, если нужна одна ячейка.

Пример 5. Маска

import pandas as pd

df = pd.DataFrame({
    "sensor": ["A", "B", "C"],
    "temp":   [22, 35, 41],
})
print(df[df["temp"] > 30])

Output:

  sensor  temp
1      B    35
2      C    41

Пример 6. .loc с маской и столбцами

import pandas as pd

df = pd.DataFrame({
    "sensor": ["A", "B", "C"],
    "temp":   [22, 35, 41],
    "hum":    [55, 60, 65],
})
print(df.loc[df["temp"] > 30, ["sensor", "hum"]])

Output:

  sensor  hum
1      B   60
2      C   65

Пример 7. isin

import pandas as pd

df = pd.DataFrame({"device": ["bot1", "bot2", "bot3"], "v": [1, 2, 3]})
print(df[df["device"].isin(["bot1", "bot3"])])

Output:

  device  v
0   bot1  1
2   bot3  3

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

  • «Цепочные присваивания» (df[df.x>0]["y"] = 5) ведут к SettingWithCopyWarning. Пишите df.loc[df.x>0, "y"] = 5.

  • df[0] НЕ означает «первая строка» — это попытка взять столбец с именем 0. Используйте df.iloc[0].

  • Срезы .loc включают правую границу, .iloc — нет. Легко перепутать.

См. также

Примечание

Лицензия и источники

Техническое описание адаптировано из официальной документации Pandas (https://pandas.pydata.org/docs/), BSD-3-Clause License. Перевод на русский, примеры и пояснения — © AlashEd Wiki.