QuieroProgramar por Rodri Gonzalez
Data Analysis · Lección 04 de 19

pandas: Selección y Filtrado

Cuando un gerente te dice "Dame los clientes de CABA con más de $500K de saldo", necesitás extraer filas y columnas específicas de una tabla de millones de registros. Esa capacidad de consultar datos se llama selección y filtrado, y es lo que más vas a hacer en tu día a día como Data Analyst.

90–120 min Prerrequisitos: Lección 03 (Lectura de datos)
01

Concepto teórico

Las 3 formas de acceder a datos en pandas

Pandas te ofrece tres mecanismos principales para acceder a datos dentro de un DataFrame. Entender cuándo usar cada uno es fundamental:

Mecanismo Selecciona por Ejemplo ¿Cuándo usarlo?
df["col"] Nombre de columna df["Nombre"] Cuando solo necesitás una o varias columnas
df.loc[fila, col] Etiqueta (nombre) df.loc[0, "Nombre"] Cuando sabés el nombre de fila y/o columna
df.iloc[fila, col] Posición (número) df.iloc[0, 2] Cuando querés acceder por posición numérica
Analogía: Pensá en una planilla de Excel. df["col"] es como seleccionar una columna entera haciendo click en la letra "C". df.loc es como ir a la celda por nombre: "fila García, columna Saldo". df.iloc es como ir por coordenadas: "fila 3, columna 2" sin importar cómo se llamen.

Selección de columnas

La operación más básica. Podés seleccionar una columna (te devuelve una Serie) o varias columnas (te devuelve un DataFrame).

# Una columna → Serie
df["Nombre"]

# Varias columnas → DataFrame (nota los dobles corchetes [[ ]])
df[["Nombre", "Saldo"]]
Error clásico: dobles corchetes. df["Nombre", "Saldo"] da KeyError. Para varias columnas necesitás pasar una lista dentro de los corchetes: df[["Nombre", "Saldo"]]. Los corchetes exteriores son del DataFrame, los interiores son de la lista Python.

Filtrado con máscaras booleanas

Acá es donde pandas se vuelve brutalmente poderoso. Una máscara booleana es una Serie de True/False que le dice a pandas "quedate con las filas que son True, descartá las que son False".

# Paso 1: Crear la máscara (Serie booleana)
mascara = df["Saldo"] > 500000    # True donde Saldo > 500K

# Paso 2: Aplicar la máscara al DataFrame
resultado = df[mascara]           # Solo las filas donde mascara es True

# O en una sola línea (lo más común):
resultado = df[df["Saldo"] > 500000]
¿Por qué se repite df dos veces? Porque el df interno genera la máscara booleana, y el df externo la usa para filtrar. Es como decirle al DataFrame "filtrarte a vos mismo según esta condición sobre vos mismo".

Combinando condiciones: & (AND), | (OR), ~ (NOT)

Para filtros complejos combinás condiciones. Atención: en pandas se usan & y | (operadores bitwise), NO and y or (operadores lógicos de Python). Y cada condición debe ir entre paréntesis obligatoriamente.

# AND: ambas condiciones deben ser True
df[(df["Saldo"] > 500000) & (df["Ciudad"] == "CABA")]

# OR: al menos una condición True
df[(df["Canal"] == "Web") | (df["Canal"] == "App")]

# NOT: invertir la condición
df[~(df["Estado"] == "Inactivo")]
Error mortal: olvidar los paréntesis. df[df["Saldo"] > 500000 & df["Ciudad"] == "CABA"] explota porque & tiene mayor precedencia que > y ==. Siempre encerrá cada condición entre paréntesis.
En el trabajo real: cuando el área de Marketing te pide "clientes activos de CABA con saldo mayor a 500K que compraron en los últimos 30 días", estás combinando 4 filtros con &. Dominar esta sintaxis es el 80% del trabajo diario de un analista.
02

Ejemplos explicados paso a paso

Ejemplo 1: Seleccionar columnas y filas básicas

Operaciones fundamentales de extracción sobre un DataFrame de clientes bancarios.

ejemplo_01_seleccion.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 2: Filtrado con una condición

El caso más habitual: necesitamos solo las filas que cumplen una condición. Observá cómo creamos la máscara booleana y la aplicamos.

ejemplo_02_filtro_simple.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 3: Múltiples condiciones con & y |

El gerente necesita: clientes activos de CABA con saldo mayor a 600K. Tres filtros combinados.

ejemplo_03_multi_filtro.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 4: loc vs iloc en acción

La diferencia entre acceder por etiqueta (loc) y por posición numérica (iloc) es sutil pero crítica.

ejemplo_04_loc_iloc.pyPython

        
Hacé clic en ▶ Ejecutar
Regla de oro: .loc incluye ambos extremos del rango (como decir "desde A hasta B, incluyendo B"). .iloc excluye el final (como el slicing estándar de Python). Memorizá esto o te va a generar bugs silenciosos.

Ejemplo 5: Filtro + selección de columnas (query compuesta)

El patrón más potente: filtrar filas Y seleccionar solo las columnas que necesitás. Es el equivalente al SELECT col1, col2 FROM tabla WHERE condicion de SQL.

ejemplo_05_query_compuesta.pyPython

        
Hacé clic en ▶ Ejecutar
03

Referencia rápida

Operación Sintaxis Devuelve
Una columna df["col"] Serie
Varias columnas df[["c1","c2"]] DataFrame
Fila por etiqueta df.loc[etiqueta] Serie
Fila por posición df.iloc[n] Serie
Celda específica df.loc[fila, col] Valor escalar
Rango de filas df.iloc[a:b] DataFrame
Filtro booleano df[df["col"] > x] DataFrame filtrado
AND (cond1) & (cond2) Máscara combinada
OR (cond1) | (cond2) Máscara combinada
NOT ~(cond) Máscara invertida
Pertenencia df["col"].isin([...]) Máscara booleana
04

Ejercicios

Nivel 1 · Básico

Ejercicio 1: Seleccionar una columna

Del DataFrame provisto, extraé la columna "Producto" e imprimila. El output debe contener Galletas.

ejercicio_01.pyDebe incluir "Galletas"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 2: Seleccionar varias columnas

Seleccioná las columnas "Producto" y "Precio" simultáneamente usando doble corchete e imprimí el resultado. Debe incluir 2800.

ejercicio_02.pyDebe incluir "2800"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 3: Filtro simple con una condición

Filtrá los productos con Precio > 500 e imprimí el resultado. Debe mostrar Vino y Detergente. Tu output debe incluir Detergente.

ejercicio_03.pyDebe incluir "Detergente"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 4: Filtro con dos condiciones AND

Del dataset de clientes, filtrá los que sean de "CABA" Y tengan Saldo > 500000. Imprimí solo las columnas Cliente y Saldo. Debe incluir García.

ejercicio_04.pyDebe incluir "García"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 5: Filtro con isin()

Filtrá los clientes que sean de "CABA" o "Rosario" usando .isin(). Imprimí cuántos encontraste con len(). Debe incluir el número 4.

ejercicio_05.pyDebe incluir "4"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 6: Acceso con iloc

Usando iloc, extraé las filas de la 1 a la 3 (inclusive) y las columnas de la 0 a la 1 (inclusive). Imprimí el resultado. Debe incluir López.

ejercicio_06.pyDebe incluir "López"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 7: Negación con ~ (NOT)

Filtrá todos los clientes que NO estén en CABA usando el operador ~. Imprimí solo los nombres. Debe incluir Pérez.

ejercicio_07.pyDebe incluir "Pérez"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 8: Query compuesta con loc

Usando .loc, filtrá clientes activos con saldo > 300K y seleccioná solo las columnas Cliente y Saldo. Imprimí el saldo promedio de ese segmento con .mean(). Debe incluir 613333.

ejercicio_08.pyDebe incluir "613333"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 9: Filtro + sort + head

Filtrá los clientes activos, ordenalos por saldo descendente con sort_values(), y mostrá solo los top 2 con .head(2). Debe incluir García.

ejercicio_09.pyDebe incluir "García"

          
Hacé clic en ▶ Ejecutar
Nivel 4 · Desafío

Ejercicio 10: Reporte segmentado completo

Generá un mini reporte: (1) Contá cuántos clientes son de CABA, (2) Cuántos están activos, (3) Cuál es el saldo promedio de los activos de CABA. Debe incluir 760000.

ejercicio_10_desafio.pyDebe incluir "760000"

          
Hacé clic en ▶ Ejecutar
05

Resumen y conexión

En la siguiente lección (05 · pandas: limpieza) vas a aprender a enfrentar el caos real de los datos: valores nulos, duplicados, tipos inconsistentes y formatos rotos. Sin limpieza, todo el análisis posterior está contaminado.

Recursos: pandas docs — Indexing and Selecting Data