Индексация и срезы в 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.