Filtrado y consulta condicional en Pandas
El filtrado de datos es una de las operaciones más comunes en el análisis de datos. Pandas proporciona potentes funciones de consulta condicional que permiten filtrar datos según diversas condiciones. Esta sección detalla varios métodos de filtrado de datos.
Filtrado por condiciones básicas
Filtrado por una sola condición
Ejemplo
# Crear datos de ejemplo
df = pd.DataFrame({
"Nombre": ["Zhang San", "Li Si", Wang Wu, "Zhao Liu", "Qian Qi"],
"Edad": [25, 30, 28, 35, 22],
"Ciudad": ["Pekín", Shanghái, "Guangzhou", "Pekín", "Shenzhen"],
"Salario": [12000, 15000, 11000, 18000, 9000],
"Departamento": [Tecnología, "Ventas", Tecnología, Operaciones, Tecnología]
})
print(Datos originales:)
print(df)
print()
# Filtro de igualdad
print(Ciudad igual a Pekín:)
print(df[df["Ciudad"] == "Pekín"])
print()
# Filtro de desigualdad
print(Ciudad distinta de Pekín:)
print(df[df["Ciudad"] != "Pekín"])
print()
# Mayor que y menor que
print(Salario mayor que 12000:)
print(df[df["Salario"] > 12000])
print()
# Condición de cadena
print(Nombre que contiene 'tres':)
print(df[df["Nombre"].str.contains("tres")])
Combinación de múltiples condiciones
Ejemplo
df = pd.DataFrame({
"Nombre": ["Zhang San", "Li Si", Wang Wu, "Zhao Liu", "Qian Qi"],
"Edad": [25, 30, 28, 35, 22],
"Ciudad": ["Pekín", Shanghái, "Guangzhou", "Pekín", "Shenzhen"],
"Salario": [12000, 15000, 11000, 18000, 9000],
"Departamento": [Tecnología, "Ventas", Tecnología, Operaciones, Tecnología]
})
# Condición AND: usar el símbolo &
print(Pekín y salario > 10000:)
print(df[(df["Ciudad"] == "Pekín") & (df["Salario"] > 10000)])
print()
# Condición OR: usar el símbolo |
print(Departamento técnico o salario > 15000:)
print(df[(df["Departamento"] == Tecnología) | (df["Salario"] > 15000)])
print()
# Condición NOT: usar el símbolo ~
print(No es departamento técnico:)
print(df[~(df["Departamento"] == Tecnología)])
print()
# Combinación compleja
print((Pekín y edad > 25) o (Shanghái):)
print(df[((df["Ciudad"] == "Pekín") & (df["Edad"] > 25)) | (df["Ciudad"] == Shanghái)])
Al combinar múltiples condiciones, cada condición debe ir entre paréntesis, y entre condiciones se usa
&(Y),|(O) para conectarlas; no se deben usar las palabras clave de Pythonand、orpalabras clave.
isin y where
Filtrado con isin
Ejemplo
df = pd.DataFrame({
"Nombre": ["Zhang San", "Li Si", Wang Wu, "Zhao Liu", "Qian Qi"],
"Ciudad": ["Pekín", Shanghái, "Guangzhou", "Pekín", "Shenzhen"],
"Departamento": [Tecnología, "Ventas", Tecnología, Operaciones, Tecnología]
})
# Filtrar en una lista
print(Ciudad es Pekín o Shanghái:)
print(df[df["Ciudad"].isin(["Pekín", Shanghái])])
print()
# No está en la lista
print(Ciudad no es Pekín ni Shanghái:)
print(df[~df["Ciudad"].isin(["Pekín", Shanghái])])
print()
# isin con múltiples columnas
df2 = pd.DataFrame({
"Ciudad": ["Pekín", Shanghái],
"Departamento": [Tecnología, "Ventas"]
})
print(Cumpliendo simultáneamente ciudad y departamento:)
print(df[df[["Ciudad", "Departamento"]].isin(df2).all(axis=1)])
Condición where
Ejemplo
import numpy as np
df = pd.DataFrame({
"A": [1, 5, 3, 7],
"B": [4, 2, 8, 3]
})
# where: conserva los valores que cumplen la condición; los que no, se establecen como NaN o un valor especificado
print(Conservar los valores mayores que 3, establecer los demás a 0:)
result = df.where(df > 3, 0)
print(result)
print()
# Usar otro DataFrame como condición
other = pd.DataFrame({
"A": [True, False, True, False],
"B": [False, True, False, True]
})
print(Filtrar según el DataFrame de condiciones:)
print(df.where(other, -1))
Filtrado de cadenas
Ejemplo
df = pd.DataFrame({
"Nombre": ["Zhang San", "Li Si", Wang Wu, "Zhao Liu", "Sun Qi"],
"Ciudad": ["Beijing", "Shanghái", "Guangzhou", "Shenzhen", "Hangzhou"],
"Correo electrónico": ["[email protected]", "[email protected]", "[email protected]",
"[email protected]", "[email protected]"]
})
# Contiene
print(Ciudad que contiene 'Pekín':)
print(df[df["Ciudad"].str.contains("Pekín")])
print()
# Inicio/Final
print(El correo comienza con zhang:)
print(df[df["Correo electrónico"].str.startswith("zhang")])
print()
# Coincidencia con expresión regular
print(Longitud del nombre de usuario del correo mayor que 4:)
print(df[df["Correo electrónico"].str.extract(r"(\w+)@")[0].str.len() > 4])
print()
# Coincidencia con múltiples patrones
print(Ciudad que comienza con 北, 上, 广, 深:)
print(df[df["Ciudad"].str.contains("^北|^上|^广|^深")])
Filtrado por rango numérico
Ejemplo
df = pd.DataFrame({
"Nombre": ["Zhang San", "Li Si", Wang Wu, "Zhao Liu", "Qian Qi"],
"Edad": [25, 30, 28, 35, 22],
"Salario": [12000, 15000, 11000, 18000, 9000]
})
# Filtrado por rango
print(Edad entre 25 y 30 (inclusive):)
print(df[df["Edad"].between(25, 30)])
print()
# Filtrado por cuantiles
q1 = df["Salario"].quantile(0.25)
q3 = df["Salario"].quantile(0.75)
print(fSalario entre el 25% y el 75% ({q1}-{q3}):)
print(df[df["Salario"].between(q1, q3)])
print()
# N registros mínimos/máximos
print(Las 3 filas con mayor salario:)
print(df.nlargest(3, "Salario"))
print()
print(Las 2 filas con menor salario:)
print(df.nsmallest(2, "Salario"))
Filtrado de datos de tiempo
Ejemplo
# Crear datos de serie temporal
df = pd.DataFrame({
"Fecha": pd.date_range("2024-01-01", periods=10, freq="D"),
"Volumen de ventas": [100, 120, 90, 150, 200, 180, 110, 130, 170, 190]
})
df = df.set_index("Fecha")
print(Datos de serie temporal:)
print(df)
print()
# Filtrar por fecha
print(Datos del 2024-01-05:)
print(df.loc["2024-01-05"])
print()
# Filtrado por rango de fechas
print(Desde 2024-01-03 hasta 2024-01-07:)
print(df.loc["2024-01-03":"2024-01-07"])
print()
# Usar truncate (corte más eficiente)
print(Filtrado con truncate:)
print(df.truncate(before="2024-01-03", after="2024-01-07"))
Método query
queryEl método proporciona una forma de filtrado más concisa al estilo SQL.
Ejemplo
df = pd.DataFrame({
"Nombre": ["Zhang San", "Li Si", Wang Wu, "Zhao Liu"],
"Edad": [25, 30, 28, 35],
"Ciudad": ["Pekín", Shanghái, "Guangzhou", "Pekín"],
"Salario": [12000, 15000, 11000, 18000]
})
# Usar el método query
print(Edad>26 y ciudad='Beijing':)
print(df.query("edad > 26 and ciudad == 'Pekín'"))
print()
# Usar variables
min_age = 26
city = "Pekín"
print(fedad>{min_age} y ciudad={city}:)
print(df.query(edad > @min_age and ciudad == @city))
print()
# Cuando el nombre de la columna tiene espacios, se necesitan comillas invertidas
df2 = df.rename(columns={"Nombre": "Apellido y nombre"})
print("Cuando el nombre de la columna tiene espacios:")
print(df2.query(`Apellido nombre` == 'Zhang San'))
Preguntas frecuentes
1. Error al combinar condiciones
Al filtrar con múltiples condiciones, use paréntesis para aclarar la prioridad y use&、|en lugar deand、or。
2. Las cadenas contienen valores nulos
Antes de usarstr.containses necesario manejar los valores nulos:df[df["列"].str.contains("x", na=False)]
3. Filtrado por índice
Si el DataFrame tiene un índice personalizado, preste atención alocyilocla diferencia.
Otras extensionesPara consultas complejas con múltiples condiciones,
queryla sintaxis del método está más cerca del lenguaje natural, lo que hace que el código sea más legible. Cuando el volumen de datos es grande,locen combinación con matrices booleanas suele serquerymás rápido.