Procesamiento de DataFrames: filtrado, ordenación y agrupación
Al finalizar este tema
Podrá extraer datos de un DataFrame de pandas mediante condiciones, ordenarlos y realizar agregaciones por grupos.
Preparación de los datos
import pandas as pd
df = pd.DataFrame({ "nombre": ["Ana", "Luis", "Pablo", "Carmen", "Sofía"], "departamento": ["Desarrollo", "Marketing", "Desarrollo", "Marketing", "Desarrollo"], "edad": [30, 25, 35, 28, 32], "salario": [5000, 3500, 6000, 4000, 5500]})Con esta tabla de cinco filas, podrás aprender todas las técnicas clave.
Selección de columnas
# Una columna — devuelve una Seriedf["nombre"]
# Varias columnas — devuelve un DataFramedf[["nombre", "salario"]]
# Añadir una columnadf["salario_neto"] = df["salario"] * 0.85
# Eliminar una columnadf = df.drop(columns=["salario_neto"])Preste atención a la diferencia entre un solo corchete (df["nombre"]) y doble corchete (df[["nombre", "salario"]]). Un solo corchete devuelve una Serie, y doble corchete devuelve un DataFrame.
Filtrado — Extracción de filas mediante condiciones
# Una condicióndf[df["edad"] >= 30]# nombre departamento edad salario# 0 Ana Desarrollo 30 5000# 2 Pablo Desarrollo 35 6000# 4 Sofía Desarrollo 32 5500
# Condición compuesta — & (AND), | (OR)df[(df["departamento"] == "Desarrollo") & (df["salario"] >= 5500)]# nombre departamento edad salario# 2 Pablo Desarrollo 35 6000# 4 Sofía Desarrollo 32 5500
# Buscar texto incluidodf[df["nombre"].str.contains("Ana")]
# Coincidir con uno de los valores de una listadf[df["departamento"].isin(["Desarrollo", "Planificación"])]Encierre las condiciones entre () y conéctelas con & o |. Esto es diferente a los operadores and/or de Python: al filtrar DataFrames, es obligatorio usar &/|.
Ordenación
# Por una columnadf.sort_values("salario") # Ascendente (menor→mayor)df.sort_values("salario", ascending=False) # Descendente
# Por varias columnasdf.sort_values(["departamento", "salario"], ascending=[True, False])# Departamento ascendente → salario descendente dentro del mismo departamento
# Restablecer el índice (porque queda desordenado después de ordenar)df_sorted = df.sort_values("salario").reset_index(drop=True)Si no se incluye reset_index(drop=True), el índice original se mantiene, resultando en un orden como 0, 3, 1, 4, 2.
Agregación por grupos — groupby
Es una de las herramientas más potentes para el análisis de datos. Responde a preguntas como "¿cuál es el salario promedio por departamento?" con una sola línea.
# Básico — promedio por departamentodf.groupby("departamento")["salario"].mean()# Desarrollo 5500.0# Marketing 3750.0
# Varias funciones de agregacióndf.groupby("departamento")["salario"].agg(["mean", "min", "max", "count"])# mean min max count# Desarrollo 5500 5000 6000 3# Marketing 3750 3500 4000 2
# Agregar varias columnasdf.groupby("departamento").agg({ "salario": "mean", "edad": "max"})# salario edad# Desarrollo 5500 35# Marketing 3750 28groupby es un concepto similar al GROUP BY de SQL. Funciona mediante el patrón división (split) → aplicación (apply) → combinación (combine).
Patrón práctico: procesamiento integral
# "Personas de Desarrollo con salario de al menos 5000, por salario descendente"result = ( df[df["departamento"] == "Desarrollo"] .query("salario >= 5000") .sort_values("salario", ascending=False) .reset_index(drop=True))
# Número de personas y salario promedio por departamentosummary = ( df.groupby("departamento") .agg( personas=("nombre", "count"), salario_promedio=("salario", "mean"), salario_máximo=("salario", "max") ) .sort_values("salario_promedio", ascending=False)).query() es una forma de definir condiciones mediante cadenas de texto. En condiciones complejas, ofrece una mejor legibilidad que df[(df["a"] > 1) & (df["b"] < 5)].
Resumen de los métodos más utilizados
| Tarea | Método | Ejemplo |
|---|---|---|
| Filtro de condiciones | df[condición] | df[df["edad"] > 30] |
| Selección de columnas | df[["a", "b"]] | df[["nombre", "salario"]] |
| Ordenación | sort_values() | df.sort_values("salario") |
| Agregación por grupo | groupby().agg() | df.groupby("departamento")["salario"].mean() |
| Los N primeros | nlargest() / nsmallest() | df.nlargest(3, "salario") |
| Valores únicos | unique() / nunique() | df["departamento"].nunique() |
| Distribución de valores | value_counts() | df["departamento"].value_counts() |
Resumen clave
El procesamiento de DataFrames es el proceso de expresar en código "qué es lo que se quiere ver". Con solo cuatro verbos — filtrar (¿qué filas?), ordenar (¿en qué orden?), agrupar (¿bajo qué criterio?) y agregar (¿qué calcular?) — se puede responder a la mayoría de las preguntas sobre los datos. Si conoces SQL, puedes considerarlo como una correspondencia 1:1 con SELECT ... WHERE ... GROUP BY ... ORDER BY.