Функция Pandas df.loc()

Pandas 常用函数Pandas: общие функции


loc[]Это метод индексации на основе меток в Pandas, используемый для выбора данных по меткам строк и столбцов. Это один из самых интуитивно понятных и часто используемых методов индексации DataFrame, позволяющий точно находить нужные нам данные.

В отличие от позиционной индексации (такой какiloc[]),loc[]он использует метки индекса, заданные в самих данных. Это означает, что даже если положение данных изменится, пока метки остаются неизменными, мы всё ещё можем точно выбрать целевые данные.


Базовый синтаксис и параметры

loc[]Это индексатор DataFrame, доступ к которому осуществляется через квадратные скобки[]для доступа. Внутри квадратных скобок можно передавать различные формы параметров, чтобы выбирать строки, столбцы или конкретные ячейки.

Формат синтаксиса

# 选择单行(返回 Series)
DataFrame.loc[行标签]

# 选择多行(返回 DataFrame)
DataFrame.loc[[行标签1, 行标签2, ...]]

# 选择行和列
DataFrame.loc[行标签, 列标签]
DataFrame.loc[行切片, 列切片]
DataFrame.loc[行条件, 列条件]

Описание параметра

Позиция параметра Тип параметра Описание
Первый параметр (строки) Метка, список меток, срез по меткам, логический массив Используется для выбора строк; может быть отдельной меткой, несколькими метками, срезом или условным выражением.
Второй параметр (столбцы) Метка, список меток, срез по меткам Необязательный параметр, используется для выбора столбцов; синтаксис такой же, как при выборе строк.

Описание возвращаемого значения

  • Один элемент: возвращает скалярное значение (одно значение).
  • Одна строка: возвращает Series.
  • Несколько строк: возвращает DataFrame.
  • Комбинация строк и столбцов: возвращает Series или DataFrame в зависимости от результата выбора.

Примеры

Давайте в совершенстве освоим на множестве примеровloc[]использование ...

Пример 1: базовое использование — использование индекса по умолчанию

Когда DataFrame использует целочисленный индекс по умолчанию,loc[]поведение ...iloc[]аналогично, но использует метки, а не позиции.

Пример

import pandas as pd

# Создайте пример DataFrame
data = {
    'name': ['Алиса', 'Боб', 'Чарли', 'Дэвид', 'Ева'],
    'age': [18, 19, 17, 18, 20],
    'score': [85, 92, 78, 90, 88],
    'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)

print("Исходный DataFrame:")
print(df)
print()

# Используйте loc для выбора одной строки (по метке индекса)
print("Выбрать строку 0:")
print(df.loc[0])
print()

# Выбрать несколько строк
print("Выберите строки 1, 3, 4:")
print(df.loc[[1, 3, 4]])
print()

# Используйте срезы для выбора последовательных строк (примечание: срезы loc включают обе границы)
print("Выбрать строки с 1 по 3 (включительно):")
print(df.loc[1:3])

Вывод:

原始 DataFrame:
      name  age  score grade
0    Alice   18     85     A
1      Bob   19     92     A
2  Charlie   17     78     B
3    David   18     90     A
4      Eve   20     88     B

选择第 0 行:
name      Alice
age          18
score        85
grade         A
Name: 0, dtype: object

选择第 1、3、4 行:
    name  age  score grade
1    Bob   19     92     A
3  David   18     90     A
4      Eve   20     88     B

选择第 1 行到第 3 行(包含两端):
      name  age  score grade
1      Bob   19     92     A
2  Charlie   17     78     B
3    David   18     90     A

Пояснение к коду:

  1. По умолчанию индекс DataFrame — это целые числа 0, 1, 2, 3, 4.
  2. df.loc[0]Выбор строки с меткой индекса 0 возвращает Series.
  3. df.loc[[1, 3, 4]]Выбирает несколько строк с указанными индексами.
  4. Важно:loc[]Его срез включает обе границы (в отличие от срезов Python),1:3включая индексы 1, 2, 3.

Пример 2: Использование пользовательского индекса

loc[]Настоящая сила loc заключается в возможности использовать пользовательские метки индекса, что является егоiloc[]принципиальным отличием.

Пример

import pandas as pd

# Создать DataFrame с пользовательским индексом
data = {
    'name': ['Алиса', 'Боб', 'Чарли', 'Дэвид', 'Ева'],
    'age': [18, 19, 17, 18, 20],
    'score': [85, 92, 78, 90, 88],
    'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd', 'e'])

print("DataFrame с пользовательским индексом:")
print(df)
print()

# Использовать пользовательскую метку для выбора одной строки
print("Выберите строку с индексом 'b':")
print(df.loc['b'])
print()

# Использовать пользовательские метки для среза
print("Выберите строки с индексами от 'b' до 'd':")
print(df.loc['b':'d'])
print()

# Выбор нескольких несмежных индексов
print("Выберите строки с индексами 'a', 'c', 'e':")
print(df.loc[['a', 'c', 'e']])

Вывод:

带自定义索引的 DataFrame:
   name  age  score grade
a  Alice   18     85     A
b    Bob   19     92     A
c  Charlie   17     78     B
d  David   18     90     A
e    Eve   20     88     B

选择索引为 'b' 的行:
name        Bob
age          19
score        92
grade         A
Name: b, dtype: object

选择索引 'b' 到 'd' 的行:
      name  age  score grade
b    Bob   19     92     A
c  Charlie   17     78     B
d  David   18     90     A

选择索引 'a', 'c', 'e' 的行:
      name  age  score grade
a  Alice   18     85     A
c  Charlie   17     78     B
e    Eve   20     88     B

Пояснение к коду:

  • Пользовательский индекс использует строковые значения 'a', 'b', 'c', 'd', 'e' вместо целочисленных индексов.
  • loc[]Использование этих меток для выбора данных очень интуитивно понятно.
  • Срез 'b':'d' включает метки 'b', 'c', 'd', а также включает оба конца.

Пример 3: Выбор конкретных столбцов

loc[]Можно выбирать не только строки, но и одновременно столбцы.

Пример

import pandas as pd

data = {
    'name': ['Алиса', 'Боб', 'Чарли', 'Дэвид', 'Ева'],
    'age': [18, 19, 17, 18, 20],
    'score': [85, 92, 78, 90, 88],
    'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd', 'e'])

# Выбор конкретных столбцов для конкретных строк
print("Выберите столбцы name и score для индекса 'b':")
print(df.loc['b', ['name', 'score']])
print()

# Выбор нескольких строк и столбцов
print("Выберите столбцы name и age для индексов 'a', 'c':")
print(df.loc[['a', 'c'], ['name', 'age']])
print()

# Выбор конкретных столбцов для всех строк
print("Столбцы name и grade всех строк:")
print(df.loc[:, ['name', 'grade']])
print()

# Совмещение среза строк и среза столбцов
print("Столбцы от name до score для индексов 'b' по 'd':")
print(df.loc['b':'d', 'name':'score'])

Вывод:

选择索引 'b' 的 name 和 score 列:
name     Bob
score    92
Name: b, dtype: object

选择索引 'a', 'c' 的 name 和 age 列:
    name  age
a  Alice   18
c  Charlie 17

所有行的 name 和 grade 列:
    name grade
a   Alice     A
b     Bob     A
c  Charlie   B
d    David    A
e     Eve      B

索引 'b' 到 'd' 的 name 到 score 列:
      name  age score
b    Bob   19    92
c  Charlie 17    78
d  David   18    90

Пояснение к коду:

  1. df.loc['b', ['name', 'score']]Выбор конкретных столбцов конкретной строки возвращает Series.
  2. df.loc[['a', 'c'], ['name', 'age']]Выбор нескольких строк и столбцов возвращает DataFrame.
  3. df.loc[:, ['name', 'grade']]Двоеточие означает выбор всех строк.
  4. df.loc['b':'d', 'name':'score']Используйте срезы одновременно и для строк, и для столбцов.

Пример 4: Выбор по булеву условию

loc[]Поддерживается использование булевых массивов или условных выражений для фильтрации данных, что является очень мощной возможностью.

Пример

import pandas as pd

data = {
    'name': ['Алиса', 'Боб', 'Чарли', 'Дэвид', 'Ева'],
    'age': [18, 19, 17, 18, 20],
    'score': [85, 92, 78, 90, 88],
    'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)

# Использовать булево условие для выбора строк, где score больше 85
print("Студенты с баллами больше 85:")
print(df.loc[df['score'] > 85])
print()

# Составное условие: score больше 85 и age меньше 19
print("Учащиеся с баллами больше 85 и возрастом меньше 19:")
print(df.loc[(df['score'] > 85) & (df['age']  85, ['name', 'score']])

Вывод:

分数大于 85 的学生:
      name  age  score grade
1      Bob   19     92     A
3    David   18     90     A
4      Eve   20     88     B

分数大于 85 且年龄小于 19 的学生:
      name  age  score grade
3    David   18     90     A

使用布尔数组选择的行:
      name  age  score grade
0    Alice   18     85     A
2  Charlie   17     78     B
4      Eve   20     88     B

分数大于 85 的学生的 name 和 score:
      name  score
1      Bob     92
3    David   90
4      Eve    88

Пояснение к коду:

  1. df.loc[df['score'] > 85]Использование фильтрации по булеву условию возвращает строки, удовлетворяющие условию.
  2. Составные условия необходимо заключать в круглые скобки и соединять с помощью&(AND) и|(OR).
  3. Вы можете напрямую передать булев массив (его длина должна совпадать с количеством строк), чтобы выбрать строки.
  4. После условия вы также можете добавить выбор столбцов для детализированной фильтрации данных.

Примечания

  • loc[]Он использует индексацию по меткам, и срез включает обе границы (в отличие от встроенных срезов Python).
  • Если переданная метка не существует, будет вызвано исключение KeyError.
  • В булевых условиях составные условия должны использовать круглые скобки и использовать&и|вместо питоновскогоandиor。
  • loc[]Чтение и изменение данных очень удобны, но в сценариях больших данных следует обращать внимание на производительность.

Важные замечания:loc[]иiloc[]Это два разных индексатора; хотя они выглядят похоже, их принципы полностью различны:loc[]На основе меток,iloc[]На основе позиций.


Итог

loc[]Это основанный на метках селектор данных в Pandas, предоставляющий интуитивный и гибкий способ доступа к данным. Благодаря комбинации меток строк и столбцов мы можем точно выбирать любые нужные нам данные.

Его основные преимущества включают: использование пользовательских индексов для повышения читаемости кода, поддержку синтаксиса срезов с включением границ и возможность комбинировать булевы условия для сложной фильтрации. В реальном анализе данных,loc[]он является одним из наиболее часто используемых методов индексации в повседневной работе.

Pandas 常用函数Pandas: общие функции

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