Función Pandas df.query()

Pandas 常用函数Funciones comunes de Pandas


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

import pandas as pd

# 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:

  1. Las condiciones de filtrado se colocan entre comillas, usando una sintaxis similar a SQL.
  2. La comparación numérica utiliza>, ==, <operadores como >, <, ==, etc.
  3. 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

import pandas as pd

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 &gt; 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 &gt;= 18 and age &lt;= 20 and score != 88&#039;))

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:

  1. El uso deandrepresenta la operación lógica AND.
  2. El uso deorrepresenta la operación lógica OR.
  3. El uso denotrepresenta la operación lógica NOT.
  4. 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

import pandas as pd

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 &gt; @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 &gt; @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 parainrealizar 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

import pandas as pd

# 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 clavein`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

import pandas as pd

# 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` &gt; 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` &gt; 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.

Pandas 常用函数Funciones comunes de Pandas

Otras extensiones