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

Pandas 常用函数Часто используемые функции Pandas


query()— это очень практичная функция фильтрации данных в Pandas. Она позволяет использовать SQL-подобные строковые выражения для фильтрации данных. По сравнению с традиционными методами булевой индексации,query()её синтаксис более краткий и интуитивно понятный, особенно хорошо подходит для обработки сложных условий фильтрации.

В работе с анализом данных часто необходимо фильтровать данные по различным условиям.query()Функция записывает условия фильтрации в строковой форме, так же как при написании SQL-запросов, что очень удобно для пользователей, знакомых с SQL. В то же время она также поддерживает использование переменных и функций Python, что делает возможной динамическую фильтрацию.


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

query()— это метод DataFrame, вызываемый через оператор точки.Он принимает строковый параметр, содержащий выражение фильтрации.

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

DataFrame.query(expr, inplace=False, **kwargs)

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

Параметр Type Обязательный Описание Значение по умолчанию
expr str Обязательный Выражение фильтрации, аналогичное предложению WHERE в SQL. -
inplace bool Optional Следует ли напрямую изменять исходный DataFrame. False

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

  • Тип возвращаемого значения: Возвращает новый DataFrame, содержащий строки, удовлетворяющие условиям фильтрации.
  • Исходные данные не изменяются: По умолчанию исходный DataFrame остаётся неизменным.

Примеры

На разнообразных примерах давайте полностью освоимquery()использование

Пример 1: Базовое использование — фильтрация по одному условию

Простейшийquery()способ — фильтровать с помощью одного условия.

Пример

import pandas as pd

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

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

# Отфильтровать студентов с баллом больше 85
print("Студенты с баллом больше 85:")
print(df.query('score > 85'))
print()

# Отфильтровать студентов, чей возраст равен 18
print("Студенты, чей возраст равен 18:")
print(df.query('age == 18'))
print()

# Отфильтровать студентов с оценкой A
print("Студенты с оценкой A:")
print(df.query('grade == "A"'))

Результат выполнения:

原始 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
5    Frank   19     95     A
6    Grace   18     82     B

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

年龄等于 18 的学生:
      name  age  score grade
0    Alice   18     85     A
3    David   18     90     A
6    Grace   18     82     B

等级为 A 的学生:
      name  age  score grade
0    Alice   18     85     A
1      Bob   19     92     A
3    David   18     90     A
5    Frank   19     95     A

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

  1. Условия фильтрации заключаются в кавычки с использованием синтаксиса, подобного SQL.
  2. Числовые сравнения используют>, ==, <и другие операторы.
  3. Сравнения строк используют двойные или одинарные кавычки.

Пример 2: Фильтрация по составному условию

query()Поддерживается использование логических операторов для объединения нескольких условий.

Пример

import pandas as pd

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

# Использовать условие AND: score больше 85 и age меньше 19
print("Студенты с score больше 85 и age меньше 19:")
print(df.query('score &gt; 85 and age  90'))
print()

# Использовать условие NOT: grade не A
print("Студенты, у которых grade не A:")
print(df.query('not grade == "A"'))
print()

# Сложное составное условие
print("Студенты в возрасте от 18 до 20 лет с баллом, не равным 88:")
print(df.query('age &gt;= 18 and age &lt;= 20 and score != 88&#039;))

Результат выполнения:

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

等级为 A 或分数大于 90 的学生:
      name  age  score grade
1      Bob   19     92     A
3    David   18     90     A
5    Frank   19     95     A

等级不为 A 的学生:
      name  age  score grade
2  Charlie   17     78     B
4      Eve   20     88     B
6    Grace   18     82     B

年龄在 18 到 20 之间且分数不等于 88 的学生:
      name  age  score grade
0    Alice   18     85     A
1      Bob   19     92     A
3    David   18     90     A
5    Frank   19     95     A

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

  1. Используйтеandдля обозначения логической операции И.
  2. Используйтеorдля обозначения логической операции ИЛИ.
  3. Используйтеnotдля обозначения логической операции НЕ.
  4. Составные условия можно произвольно комбинировать для формирования сложной логики фильтрации.

Пример 3: Использование переменных Python

query()Поддерживается использование переменных Python в выражениях, что очень полезно в динамических запросах.

Пример

import pandas as pd

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

# Используйте символ @ для ссылки на переменные Python
min_score = 85
target_grade = 'A'

print("Фильтрация с переменной - score больше {}:".format(min_score))
print(df.query('score &gt; @min_score'))
print()

print("Фильтрация с переменной - grade имеет значение '{}':".format(target_grade))
print(df.query('grade == @target_grade'))
print()

# Использовать список в качестве переменной
target_grades = ['A', 'B']
print("Студенты с оценками в {}:".format(target_grades))
print(df.query('grade in @target_grades'))
print()

# Использовать функцию Python
def get_average_score(df):
    return df['score'].mean()

print("Студенты с баллами выше среднего:")
print(df.query('score &gt; @get_average_score(df)'))

Результат выполнения:

使用变量筛选 - 分数大于 85:
      name  age  score grade
1      Bob   19     92     A
3    David   18     90     A
4      Eve   20     88     B
5    Frank   19     95     A

使用变量筛选 - 等级为 'A':
      name  age  score grade
0    Alice   18     85     A
1      Bob   19     92     A
3    David   18     90     A
5    Frank   19     95     A

等级在 ['A', 'B'] 中的学生:
      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
5    Frank   19     95     A
6    Grace   18     82     B

分数高于平均分的学生:
      name  age  score grade
1      Bob   19     92     A
3    David   18     90     A
5    Frank   19     95     A

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

  • Используйте@символ для ссылки на переменные Python в выражениях query.
  • Вы можете напрямую использовать списки Python дляinпроверок in.
  • Вы можете вызывать функции Python для вычисления динамических порогов.

Пример 4: операции со строками

query()Он также поддерживает некоторые распространённые операции со строками.

Пример

import pandas as pd

# Создайте DataFrame со строковыми столбцами
data = {
    'name': ['Алиса', 'Боб', 'Чарли', 'Дэвид', 'Eve', 'Frank', 'Grace'],
    'city': ['Пекин', 'Шанхай', 'Пекин', 'Guangzhou', 'Shanghai', 'Beijing', 'Shenzhen'],
    'score': [85, 92, 78, 90, 88, 95, 82]
}
df = pd.DataFrame(data)

# Отфильтровать записи для конкретного города
print("Студенты в Пекине:")
print(df.query('city == "Beijing"'))
print()

# Проверка вхождения строки (с помощью in)
print("Студенты в Шанхае или Пекине:")
print(df.query('city in ["Shanghai", "Beijing"]'))
print()

# Используйте @ для ссылки на переменную, содержащую строку
target_city = 'Guangzhou'
print("Студенты в {}:".format(target_city))
print(df.query('city == @target_city'))

Результат выполнения:

在北京的学生:
      name      city  score
0    Alice   Beijing     85
2  Charlie   Beijing     78
5    Frank   Beijing     95

在上海或北京的学生:
      name      city  score
0    Alice   Beijing     85
1      Bob   Shanghai     92
2  Charlie   Beijing     78
4      Eve   Shanghai     88
5    Frank   Beijing     95

在 Guangzhou 的学生:
      name       city  score
3    David  Guangzhou     90

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

  • query()Поддерживает сравнение строк на равенство.
  • Вы можете использоватьinключевое слово для проверки, содержится ли элемент в списке.
  • Вы можете использовать@для ссылки на строковые переменные.

Пример 5: Обработка имён столбцов с пробелами или специальными символами

Если имена столбцов содержат пробелы или специальные символы, обратные кавычки `` ` `` можно использовать для обертывания имён столбцов.

Пример

import pandas as pd

# Создать DataFrame с именами столбцов, содержащими пробелы
data = {
    'student name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'score': [85, 92, 78, 90, 88],
    'pass status': [True, True, False, True, True]
}
df = pd.DataFrame(data)

print("Исходный DataFrame (имена столбцов содержат пробелы):")
print(df)
print()

# Используйте обратные кавычки, чтобы обернуть имена столбцов
print("Студенты с баллом больше 85:")
print(df.query('`score` &gt; 85'))
print()

print("Студенты с pass status True:")
print(df.query('`pass status` == True'))
print()

# Этот метод также может обрабатывать зарезервированные слова в качестве имен столбцов
df2 = pd.DataFrame({
    'class': ['A', 'B', 'A', 'B', 'A'],
    'def': [1, 2, 3, 4, 5]  # def — это зарезервированное слово Python
})
print("Использование зарезервированного слова в качестве имени столбца:")
print(df2.query('`def` &gt; 3'))

Результат выполнения:

原始 DataFrame(列名包含空格):
  student name  score  pass status
0       Alice     85        True
1         Bob     92        True
2    Charlie     78       False
3     David   90        True
4        Eve     88        True

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

通过状态为 True 的学生:
  student name  score  pass status
0       Alice     85        True
1         Bob     92        True
3       David     90        True
4        Eve     88        True

使用保留字作为列名:
  class  def
3     B    4
4     A    5

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

  • Используя обратные кавычки, можно обрабатывать случаи, когда имена столбцов содержат пробелы или конфликтуют с зарезервированными словами Python.
  • `score`и`pass status`Обратные кавычки используются для ссылки на имена столбцов.
  • `def`Он демонстрирует, как обрабатывать зарезервированные слова Python в качестве имён столбцов.

Примечания

  • query()Имена столбцов в выражениях должны быть допустимыми идентификаторами Python или заключены в обратные кавычки.
  • В сравнениях строк можно использовать одинарные или двойные кавычки.
  • Используйте@символ для ссылки на переменные Python.
  • Для больших DataFrame,query()производительность обычно превосходит традиционную булеву индексацию.
  • Если выражение фильтрации содержит зарезервированные слова или специальные символы, необходимо использовать обратные кавычки.

Совет:query()Особенно подходит для сценариев, где условия фильтрации нужно динамически формировать, например для фильтрации данных на основе пользовательского ввода или файлов конфигурации. В сочетании с возможностями форматирования строк Python можно достичь очень гибких запросов к данным.


Итог

query()— это мощная функция фильтрации данных в Pandas. Она предоставляет SQL-подобный синтаксис запросов, делая сложную условную фильтрацию более краткой и читаемой.

Его основные преимущества включают: краткий и интуитивно понятный синтаксис, поддержку составных логических операций, поддержку переменных и функций Python и возможность обработки специальных имён столбцов. В реальном анализе данных, особенно когда условия фильтрации нужно динамически конструировать,query()это очень практичный инструмент.

Pandas 常用函数Часто используемые функции Pandas

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