Выбор данных Pandas (loc / iloc / at)

Выбор данных — одна из самых часто используемых операций в Pandas. Пониманиеloc、iloc、atразличий и вариантов использования позволит вам обрабатывать данные более эффективно.


Разница между loc и iloc

Характеристика loc iloc
Метод индексации Индексация по меткам Целочисленная (позиционная) индексация
Срезы Включает конечную позицию Не включает конечную позицию
Одиночное значение Возвращает скаляр Возвращает скаляр
Рекомендуемый сценарий Когда есть явные метки индекса При выборе по позиции

Пример

import pandas as pd

# Создать пример 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

Выбор строк

Пример

import pandas as pd

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"])

Выбор столбцов

Пример

import pandas as pd

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"])

Выбор конкретных строк и столбцов (рекомендуемый подход)

Пример

import pandas as pd

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

Выбор по позиции

Пример

import pandas as pd

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:])

Выбор столбцов

Пример

import pandas as pd

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 pandas as pd
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")

Выбор по условию

Фильтрация данных с помощью логических условий — одна из самых распространённых операций.

Пример

import pandas as pd

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Используется для выбора нескольких значений. Выбор подходящего метода может повысить производительность и читаемость кода.

Другие расширения