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.
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 |
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"]]
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]
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")]
df[df["Saldo"] > 500000 & df["Ciudad"] == "CABA"] explota porque & tiene mayor
precedencia que > y ==. Siempre encerrá cada condición entre paréntesis.
&. Dominar esta sintaxis es el 80% del trabajo diario de un analista.
Ejemplos explicados paso a paso
Ejemplo 1: Seleccionar columnas y filas básicas
Operaciones fundamentales de extracción sobre un DataFrame de clientes bancarios.
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.
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.
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.
Hacé clic en ▶ Ejecutar
.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.
Hacé clic en ▶ Ejecutar
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 |
Ejercicios
Ejercicio 1: Seleccionar una columna
Del DataFrame provisto, extraé la columna "Producto" e imprimila. El output debe contener
Galletas.
Hacé clic en ▶ Ejecutar
Ejercicio 2: Seleccionar varias columnas
Seleccioná las columnas "Producto" y "Precio" simultáneamente usando doble corchete
e imprimí el resultado. Debe incluir 2800.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
Resumen y conexión
df["col"]selecciona columnas.df[["c1","c2"]]selecciona varias.df.locaccede por etiqueta (nombre).df.ilocaccede por posición numérica.- Las máscaras booleanas (
df[df["col"] > x]) son el mecanismo de filtrado más poderoso. - Usá
&(AND),|(OR),~(NOT) para combinar condiciones. Siempre con paréntesis. .isin()es la alternativa elegante para filtrar por múltiples valores.- Combiná filtros con
.loc[filtro, columnas]para queries compuestas estilo SQL.
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.