Función Pandas df.query()
query()Es una función de filtrado de datos muy práctica en Pandas; permite utilizar expresiones de cadena similares a SQL para filtrar datos. En comparación con el método tradicional de indexación booleana,query()su sintaxis es más concisa e intuitiva, especialmente adecuada para manejar condiciones de filtrado complejas.
En el trabajo de análisis de datos, a menudo es necesario filtrar datos según diversas condiciones.query()La función escribe las condiciones de filtrado en formato de cadena, como si se escribiera una consulta SQL, lo cual es muy amigable para los usuarios familiarizados con SQL. Al mismo tiempo, también admite el uso de variables y funciones de Python, lo que hace posible el filtrado dinámico.
Sintaxis básica y parámetros
query()Es un método de DataFrame, que mediante el operador de punto.se invoca. Acepta un parámetro de cadena que contiene la expresión de filtrado.
Formato de sintaxis
DataFrame.query(expr, inplace=False, **kwargs)
Descripción de parámetros
| Parámetro | Tipo | Obligatorio | Descripción | Valor predeterminado |
|---|---|---|---|---|
| expr | str | Obligatorio | Expresión de filtrado, similar a la cláusula WHERE de SQL. | - |
| inplace | bool | Opcional | Si se modifica directamente el DataFrame original. | False |
Descripción del valor de retorno
- Tipo de valor de retorno: Devuelve un nuevo DataFrame que contiene las filas que cumplen las condiciones de filtrado.
- No modifica los datos originales: De forma predeterminada, el DataFrame original permanece sin cambios.
Ejemplos
Vamos a dominar por completo, mediante abundantes ejemplos,query()el uso de esta función.
Ejemplo 1: Uso básico - Filtrado de una sola condición
La forma más sencillaquery()de usarlo es filtrar con una sola condición.
Ejemplo
# Crear un DataFrame de ejemplo
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', '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 original:")
print(df)
print()
# Filtrar estudiantes con puntuación mayor que 85
print("Estudiantes con puntuación mayor que 85:")
print(df.query('score > 85'))
print()
# Filtrar estudiantes con edad igual a 18
print("Estudiantes con edad igual a 18:")
print(df.query('age == 18'))
print()
# Filtrar estudiantes con calificación A
print("Estudiantes con calificación A:")
print(df.query('grade == "A"'))
Resultado de la ejecución:
原始 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
Análisis del código:
- Las condiciones de filtrado se colocan entre comillas, usando una sintaxis similar a SQL.
- La comparación numérica utiliza
>,==,<operadores como >, <, ==, etc. - La comparación de cadenas usa comillas dobles o simples.
Ejemplo 2: Filtrado con condiciones compuestas
query()Admite el uso de operadores lógicos para combinar múltiples condiciones.
Ejemplo
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', '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)
# Usar condición AND: puntuación mayor que 85 y edad menor que 19
print("Estudiantes con puntuación mayor que 85 y edad menor que 19:")
print(df.query('score > 85 and age 90'))
print()
# Usar condición NOT: calificación no es A
print("Estudiantes cuya calificación no es A:")
print(df.query('not grade == "A"'))
print()
# Condición compuesta compleja
print("Estudiantes con edad entre 18 y 20 y puntuación distinta de 88:")
print(df.query('age >= 18 and age <= 20 and score != 88'))
Resultado de la ejecución:
分数大于 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
Análisis del código:
- El uso de
andrepresenta la operación lógica AND. - El uso de
orrepresenta la operación lógica OR. - El uso de
notrepresenta la operación lógica NOT. - Las condiciones compuestas pueden combinarse de cualquier manera para formar lógicas de filtrado complejas.
Ejemplo 3: Uso de variables de Python
query()Admite el uso de variables de Python en las expresiones, lo cual es muy útil en consultas dinámicas.
Ejemplo
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', '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)
# Usar el símbolo @ para referenciar variables de Python
min_score = 85
target_grade = 'A'
print("Filtrar con variable - puntuación mayor que {}:".format(min_score))
print(df.query('score > @min_score'))
print()
print("Filtrar con variable - calificación es '{}':".format(target_grade))
print(df.query('grade == @target_grade'))
print()
# Usar una lista como variable
target_grades = ['A', 'B']
print("Estudiantes cuya calificación está en {}:".format(target_grades))
print(df.query('grade in @target_grades'))
print()
# Usar una función de Python
def get_average_score(df):
return df['score'].mean()
print("Estudiantes con puntuación superior al promedio:")
print(df.query('score > @get_average_score(df)'))
Resultado de la ejecución:
使用变量筛选 - 分数大于 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
Análisis del código:
- Usando el símbolo
@@ se pueden referenciar variables de Python en la expresión de consulta. - Se pueden usar directamente listas de Python para
inrealizar la comprobación `in`. - Se pueden llamar funciones de Python para calcular umbrales dinámicos.
Ejemplo 4: Operaciones con cadenas
query()También admite algunas operaciones comunes con cadenas.
Ejemplo
# Crear un DataFrame con columna de cadenas
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace'],
'city': ['Beijing', 'Shanghai', 'Beijing', 'Guangzhou', 'Shanghai', 'Beijing', 'Shenzhen'],
'score': [85, 92, 78, 90, 88, 95, 82]
}
df = pd.DataFrame(data)
# Filtrar registros de una ciudad específica
print("Estudiantes en Beijing:")
print(df.query('city == "Beijing"'))
print()
# Comprobación de inclusión de cadenas (usando in)
print("Estudiantes en Shanghái o Beijing:")
print(df.query('city in ["Shanghai", "Beijing"]'))
print()
# Usar @ para referenciar una variable que contiene una cadena
target_city = 'Guangzhou'
print("Estudiantes en {}:".format(target_city))
print(df.query('city == @target_city'))
Resultado de la ejecución:
在北京的学生:
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
Análisis del código:
query()Admite la comparación de igualdad de cadenas.- Se puede utilizar la palabra clave
in`in` para comprobar si el elemento está en la lista. - Se puede usar el símbolo
@@ para referenciar variables de cadena.
Ejemplo 5: Manejo de casos con espacios o caracteres especiales en los nombres de columna
Si el nombre de la columna contiene espacios o caracteres especiales, se puede usar el acento grave `` ` `` para envolver el nombre de columna.
Ejemplo
# Crear un DataFrame con nombres de columna que contienen espacios
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 original (los nombres de columna contienen espacios):")
print(df)
print()
# Usar acentos graves para envolver los nombres de columna
print("Estudiantes con puntuación mayor que 85:")
print(df.query('`score` > 85'))
print()
print("Estudiantes cuyo estado de aprobación es True:")
print(df.query('`pass status` == True'))
print()
# También se puede usar este método para manejar palabras reservadas como nombres de columna
df2 = pd.DataFrame({
'class': ['A', 'B', 'A', 'B', 'A'],
'def': [1, 2, 3, 4, 5] # def es una palabra reservada de Python
})
print("Usando palabra reservada como nombre de columna:")
print(df2.query('`def` > 3'))
Resultado de la ejecución:
原始 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
Análisis del código:
- Mediante el uso de acentos graves, se pueden manejar situaciones donde el nombre de columna contiene espacios o entra en conflicto con palabras reservadas de Python.
`score`y`pass status`Se utilizan para referenciar nombres de columna.`def`Muestra cómo manejar palabras reservadas de Python como nombres de columna.
Notas
query()Los nombres de columna en la expresión deben ser identificadores válidos de Python o estar envueltos entre acentos graves.- La comparación de cadenas puede usar comillas simples o dobles.
- Usar el símbolo
@@ para referenciar variables de Python. - Para DataFrames grandes,
query()el rendimiento de df.query() suele ser superior al de la indexación booleana tradicional. - Si la expresión de filtrado contiene palabras reservadas o caracteres especiales, se deben usar acentos graves.
Consejo:
query()Es especialmente adecuado para escenarios donde se necesitan construir condiciones de filtrado dinámicamente, como filtrar datos según la entrada del usuario o archivos de configuración. Combinado con la funcionalidad de formato de cadenas de Python, se pueden lograr consultas de datos muy flexibles.
Resumen
query()Es una poderosa función de filtrado de datos en Pandas; proporciona una sintaxis de consulta similar a SQL, lo que hace que el filtrado de condiciones complejas sea más conciso y legible.
Sus principales ventajas incluyen: sintaxis concisa e intuitiva, soporte para operaciones lógicas compuestas, soporte para variables y funciones de Python y capacidad para manejar nombres de columna especiales. En el análisis de datos real, especialmente cuando se necesitan construir condiciones de filtrado dinámicamente,query()es una herramienta muy práctica.
Funciones comunes de Pandas