Функция Pandas df.query()
Часто используемые функции 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()способ — фильтровать с помощью одного условия.
Пример
# Создать пример 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
Пояснение к коду:
- Условия фильтрации заключаются в кавычки с использованием синтаксиса, подобного SQL.
- Числовые сравнения используют
>,==,<и другие операторы. - Сравнения строк используют двойные или одинарные кавычки.
Пример 2: Фильтрация по составному условию
query()Поддерживается использование логических операторов для объединения нескольких условий.
Пример
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 > 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 >= 18 and age <= 20 and score != 88'))
Результат выполнения:
分数大于 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
Пояснение к коду:
- Используйте
andдля обозначения логической операции И. - Используйте
orдля обозначения логической операции ИЛИ. - Используйте
notдля обозначения логической операции НЕ. - Составные условия можно произвольно комбинировать для формирования сложной логики фильтрации.
Пример 3: Использование переменных Python
query()Поддерживается использование переменных Python в выражениях, что очень полезно в динамических запросах.
Пример
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 > @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 > @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()Он также поддерживает некоторые распространённые операции со строками.
Пример
# Создайте 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: Обработка имён столбцов с пробелами или специальными символами
Если имена столбцов содержат пробелы или специальные символы, обратные кавычки `` ` `` можно использовать для обертывания имён столбцов.
Пример
# Создать 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` > 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` > 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()это очень практичный инструмент.