Выбор данных Pandas (loc / iloc / at)
Выбор данных — одна из самых часто используемых операций в Pandas. Пониманиеloc、iloc、atразличий и вариантов использования позволит вам обрабатывать данные более эффективно.
Разница между loc и iloc
| Характеристика | loc | iloc |
|---|---|---|
| Метод индексации | Индексация по меткам | Целочисленная (позиционная) индексация |
| Срезы | Включает конечную позицию | Не включает конечную позицию |
| Одиночное значение | Возвращает скаляр | Возвращает скаляр |
| Рекомендуемый сценарий | Когда есть явные метки индекса | При выборе по позиции |
Пример
# Создать пример DataFrame
df = pd.DataFrame({
"Имя": ["Чжан Сань", "Ли Сы", "Ван У", "Zhao Liu", "Qian Qi"],
"Возраст": [25, 30, 28, 35, 22],
"Город": ["Пекин", "Шанхай", "Гуанчжоу", "Шэньчжэнь", "Ханчжоу"]
}, index=[1, 3, 5, 7, 9]) # Примечание: индекс не является непрерывным
print("DataFrame:")
print(df)
print()
# loc: использовать индексацию по меткам (включая конец)
print("df.loc[1:5] (срез по меткам, включает 5):")
print(df.loc[1:5])
print()
# iloc: использовать позиционную индексацию (исключая конец)
print("df.iloc[0:2] (срез по позициям, исключает 2):")
print(df.iloc[0:2])
Использование loc
Выбор строк
Пример
df = pd.DataFrame({
"Имя": ["Чжан Сань", "Ли Сы", "Ван У", "Чжао Лю"],
"Возраст": [25, 30, 28, 35],
"Город": ["Пекин", "Шанхай", "Гуанчжоу", "Шэньчжэнь"]
}, index=["a", "b", "c", "d"])
# Выбор одной строки (возвращает Series)
print("Выберите одну строку:")
print(df.loc["a"])
print()
# Выбрать несколько строк
print("Выберите несколько строк:")
print(df.loc[["a", "c"]])
print()
# Выбор среза (включает начало и конец)
print("Выбор среза:")
print(df.loc["a":"c"])
Выбор столбцов
Пример
df = pd.DataFrame({
"Имя": ["Чжан Сань", "Ли Сы", "Ван У"],
"Возраст": [25, 30, 28],
"Город": ["Пекин", "Шанхай", "Гуанчжоу"]
}, index=["a", "b", "c"])
# Выбор одного столбца
print("Выберите один столбец:")
print(df.loc[:, "Name"])
print()
# Выбор нескольких столбцов
print("Выберите несколько столбцов:")
print(df.loc[:, ["Name", "City"]])
print()
# Выбор среза столбцов
print("Выбор столбцов через срез:")
print(df.loc[:, "Name":"City"])
Выбор конкретных строк и столбцов (рекомендуемый подход)
Пример
df = pd.DataFrame({
"Имя": ["Чжан Сань", "Ли Сы", "Ван У", "Чжао Лю"],
"Возраст": [25, 30, 28, 35],
"Город": ["Пекин", "Шанхай", "Гуанчжоу", "Шэньчжэнь"]
}, index=["a", "b", "c", "d"])
# Выбор конкретных строк и столбцов
print("Выбор одного значения:")
print(df.loc["a", "Name"]) # Возвращает "Zhang San"
print(type(df.loc["a", "Name"])) # Тип — str
print()
# Выбор нескольких строк и столбцов
print("Выбор подмножества:")
print(df.loc[["a", "c"], ["Name", "City"]])
print()
# Выбор по условию
print("Строки с Age больше 28:")
print(df.loc[df["Age"] > 28])
Использование iloc
Выбор по позиции
Пример
df = pd.DataFrame({
"Имя": ["Чжан Сань", "Ли Сы", "Ван У", "Чжао Лю"],
"Возраст": [25, 30, 28, 35],
"Город": ["Пекин", "Шанхай", "Гуанчжоу", "Шэньчжэнь"]
})
# Выбрать строку 0
print("Выбрать строку 0:")
print(df.iloc[0])
print()
# Выбрать первые 3 строки
print("Выбор первых 3 строк:")
print(df.iloc[:3])
print()
# Выбрать конкретные строки
print("Выбор конкретных строк:")
print(df.iloc[[0, 2, 3]])
print()
# Отрицательная индексация (начиная с конца)
print("Выбор последней строки:")
print(df.iloc[-1])
print()
print("Выбор последних 3 строк:")
print(df.iloc[-3:])
Выбор столбцов
Пример
df = pd.DataFrame({
"Имя": ["Чжан Сань", "Ли Сы", "Ван У"],
"Возраст": [25, 30, 28],
"Город": ["Пекин", "Шанхай", "Гуанчжоу"]
})
# Выбрать столбец 0
print("Столбец 0:")
print(df.iloc[:, 0])
print()
# Выбрать столбцы 1 и 2
print("Выберите несколько столбцов:")
print(df.iloc[:, [1, 2]])
print()
# Выбор среза
print("Выбор столбцов через срез:")
print(df.iloc[:, 0:2])
at и iat (получение одного значения)
atиiat— это аксессоры, специально предназначенные для получения/установки одного значения, что быстрее, чемlocиiloc>更快。
Пример
import time
import numpy as np
# Создание большого DataFrame для тестирования производительности
df = pd.DataFrame(np.random.randn(1000, 10), columns=[f"col_{i}" for i in range(10)])
# at получает одно значение (индексация по метке)
print(f"at: {df.at[0, 'col_0']}")
# iat получает одно значение (позиционная индексация)
print(f"iat: {df.iat[0, 0]}")
# Сравнение производительности
n = 10000
start = time.time()
for _ in range(n):
_ = df.iloc[0, 0]
print(f"время iloc: {time.time() - start:.4f}s")
start = time.time()
for _ in range(n):
_ = df.iat[0, 0]
print(f"Время iat: {time.time() - start:.4f}s")
Выбор по условию
Фильтрация данных с помощью логических условий — одна из самых распространённых операций.
Пример
df = pd.DataFrame({
"Имя": ["Чжан Сань", "Ли Сы", "Ван У", "Чжао Лю"],
"Возраст": [25, 30, 28, 35],
"Город": ["Пекин", "Шанхай", "Гуанчжоу", "Пекин"],
"Зарплата": [12000, 15000, 11000, 18000]
})
# Одно условие
print("Сотрудники старше 28:")
print(df[df["Age"] > 28])
print()
# Несколько условий (с использованием & | ~)
print("Пекин и зарплата больше 12000:")
print(df[(df["City"] == "Beijing") & (df["Salary"] > 12000)])
print()
# Фильтрация isin
print("Город — Пекин или Шанхай:")
print(df[df["City"].isin(["Beijing", "Shanghai"])])
print()
# Проверка вхождения подстроки
print("Имя содержит 'San':")
print(df[df["Name"].str.contains("San")])
Примечания
1. Срез включает конечную позицию
locсрез включает конечную позицию,ilocне включает его.
2. Возникает ошибка, если индекс не существует
Использованиеlocесли индекс не существует, возникает KeyError. Можно использоватьloc[index_list]в сочетании сreindex。
3. Рекомендуется использоватьloc
becauselocБолее читаемый и менее подверженный ошибкам, если только вам не нужно выбирать по позиции.
Другие расширения
at/iatЯвляется самым быстрым способом доступа к одному значению.loc/ilocИспользуется для выбора нескольких значений. Выбор подходящего метода может повысить производительность и читаемость кода.