Функция Pandas df.loc()
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[]аналогично, но использует метки, а не позиции.
Пример
# Создайте пример 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
Пояснение к коду:
- По умолчанию индекс DataFrame — это целые числа 0, 1, 2, 3, 4.
df.loc[0]Выбор строки с меткой индекса 0 возвращает Series.df.loc[[1, 3, 4]]Выбирает несколько строк с указанными индексами.- Важно:
loc[]Его срез включает обе границы (в отличие от срезов Python),1:3включая индексы 1, 2, 3.
Пример 2: Использование пользовательского индекса
loc[]Настоящая сила loc заключается в возможности использовать пользовательские метки индекса, что является егоiloc[]принципиальным отличием.
Пример
# Создать 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[]Можно выбирать не только строки, но и одновременно столбцы.
Пример
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
Пояснение к коду:
df.loc['b', ['name', 'score']]Выбор конкретных столбцов конкретной строки возвращает Series.df.loc[['a', 'c'], ['name', 'age']]Выбор нескольких строк и столбцов возвращает DataFrame.df.loc[:, ['name', 'grade']]Двоеточие означает выбор всех строк.df.loc['b':'d', 'name':'score']Используйте срезы одновременно и для строк, и для столбцов.
Пример 4: Выбор по булеву условию
loc[]Поддерживается использование булевых массивов или условных выражений для фильтрации данных, что является очень мощной возможностью.
Пример
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
Пояснение к коду:
df.loc[df['score'] > 85]Использование фильтрации по булеву условию возвращает строки, удовлетворяющие условию.- Составные условия необходимо заключать в круглые скобки и соединять с помощью
&(AND) и|(OR). - Вы можете напрямую передать булев массив (его длина должна совпадать с количеством строк), чтобы выбрать строки.
- После условия вы также можете добавить выбор столбцов для детализированной фильтрации данных.
Примечания
loc[]Он использует индексацию по меткам, и срез включает обе границы (в отличие от встроенных срезов Python).- Если переданная метка не существует, будет вызвано исключение KeyError.
- В булевых условиях составные условия должны использовать круглые скобки и использовать
&и|вместо питоновскогоandиor。 loc[]Чтение и изменение данных очень удобны, но в сценариях больших данных следует обращать внимание на производительность.
Важные замечания:
loc[]иiloc[]Это два разных индексатора; хотя они выглядят похоже, их принципы полностью различны:loc[]На основе меток,iloc[]На основе позиций.
Итог
loc[]Это основанный на метках селектор данных в Pandas, предоставляющий интуитивный и гибкий способ доступа к данным. Благодаря комбинации меток строк и столбцов мы можем точно выбирать любые нужные нам данные.
Его основные преимущества включают: использование пользовательских индексов для повышения читаемости кода, поддержку синтаксиса срезов с включением границ и возможность комбинировать булевы условия для сложной фильтрации. В реальном анализе данных,loc[]он является одним из наиболее часто используемых методов индексации в повседневной работе.
Pandas: общие функции