Indice / Practicas / EJ-4.3
EJ-4.3 · Seleccion con loc, isin y between
Dos condiciones combinadas sobre el padrón de clientes. La parte interesante no es escribirlas: es explicar por qué de 45 clientes que viven en esas ciudades quedan 24, y qué pasó con los otros 21.
Qué hay que hacer
A partir de clientes_crudos.csv, producir
clientes_seleccion.csv: los clientes que viven en
Mendoza, Rosario o Salta y tienen entre 25 y 60
años, con cinco columnas y ordenados por id.
ELI5Explicado facil
Es una lista de invitados con dos requisitos: que vivan en una de tres ciudades y que tengan cierta edad. Los dos requisitos a la vez, no uno u otro.
Y hay dos fichas donde la edad está escrita como «treinta» o directamente no está. Esas personas no entran - pero tampoco es que hayan sido rechazadas por edad: es que nadie pudo comprobar el requisito. La diferencia importa cuando alguien pregunta.
Archivos
- Entrada ·
clientes_crudos.csv - Objetivo ·
clientes_seleccion.csv - Herramienta ·
comparar.py
La cuenta que hay que poder hacer
| Grupo | Cuántos |
|---|---|
| Clientes de Mendoza, Rosario o Salta | 45 |
| - descartados por edad fuera de 25 a 60 | 19 |
| - descartados porque la edad no es un número | 2 |
| En la salida | 24 |
Si tu archivo tiene 24 filas pero no podés explicar esas dos líneas del medio, el ejercicio no está terminado. El segundo grupo es el que no aparece en ningún lado si no lo contás a propósito.
Cómo saber si te salió
python comparar.py mi_salida.csv clientes_seleccion.csv
Antes de arrancar, mirá los datos
| id | nombre | correo | edad | ciudad | fecha_alta |
|---|---|---|---|---|---|
| C0001 | José Paz | jose.paz@example.com | 62 | Salta | 2025-02-20 |
| C0002 | Lucía Peña | lucia.pena@example.com | 48 | Salta | 2025-01-05 |
| C0003 | Santiago Herrera | santiago.herrera@example.com | 40 | Salta | 2024-05-12 |
| C0004 | José Rodríguez | jose.rodriguez@example.com | 67 | Paraná | 2024-08-11 |
| C0005 | Walter Gutiérrez | walter.gutierrez@example.com | 34 | Rosario | 2026-01-01 |
El contrato de salida
clientes_seleccion.csv · 24 filas
| Columna | Tipo | Que lleva |
|---|---|---|
id | texto | El id original |
nombre | texto | TAL CUAL viene, sin normalizar |
correo | texto | TAL CUAL viene, sin normalizar |
edad | entero | La edad ya convertida a numero, entre 25 y 60 |
ciudad | texto | Mendoza, Rosario o Salta |
Que hacer con cada defecto
| Defecto | Donde | Accion | Adonde va |
|---|---|---|---|
| edad no numerica ('treinta') o ausente (vacio, NaN, N/A, null, -) | 2 de los 45 clientes de esas tres ciudades | NO NO se corrige. to_numeric con coerce los deja ausentes, y un ausente no cumple between: quedan afuera | no entran en clientes_seleccion.csv |
| edad fuera del rango 25 a 60 | 19 de los 45 | quedan quedan afuera, que es lo que pide el enunciado | no entran en clientes_seleccion.csv |
| nombres con espacios de mas y correos en mayusculas | 3 de los 24 seleccionados | NO NO se normalizan: se escriben tal cual vienen | clientes_seleccion.csv |
| correos sin arroba | 2 de los 24 seleccionados | NO NO se valida en este ejercicio: el correo no es una condicion | clientes_seleccion.csv |
Una fila puede tener mas de un problema. Se informa solo el primero de esta lista:
- convertir edad a numero con errors='coerce'
- armar la mascara de ciudad con isin
- armar la mascara de edad con between
- combinar las dos con & y parentesis
- seleccionar con loc las filas y las columnas
La conversion va primero porque between sobre una columna de texto no compara numeros. Y las dos mascaras se combinan antes de indexar, en una sola operacion de loc: filtrar dos veces seguidas tambien funciona, pero deja de ser una sola seleccion y es donde aparecen los problemas de copias.
Conteos clave
| filas de entrada | 120 |
|---|---|
| clientes de las tres ciudades | 45 |
| clientes_seleccion.csv | 24 |
| descartados por edad fuera de rango | 19 |
| descartados por edad ausente o no numerica | 2 |
| edad minima en la salida | 25 |
| edad maxima en la salida | 59 |
| por motivo |
Invariantes
Comprobaciones que tu resultado tiene que cumplir. Corrilas vos mismo antes de comparar los archivos:
len(seleccion) == 24
24 + 19 + 2 == 45
seleccion['id'].is_unique
set(seleccion['ciudad']) <= {'Mendoza', 'Rosario', 'Salta'}
seleccion['edad'].between(25, 60).all()
seleccion.notna().all().all()
seleccion['id'].is_monotonic_increasing
PISTASSi te trabas, abri esto
- between incluye los dos extremos por defecto. Con 25 y 60 escritos asi, un cliente de 25 entra.
- Los parentesis alrededor de cada condicion no son estilo: & tiene mas precedencia que las comparaciones.
- Las 2 filas que se caen por la edad ausente no aparecen en ningun lado. Contalas: 24 + 19 + 2 tiene que dar 45.
- loc acepta la mascara y la lista de columnas en la misma expresion. Es la forma que conviene aprender.
Así tiene que quedar
| id | nombre | correo | edad | ciudad |
|---|---|---|---|---|
| C0002 | Lucía Peña | lucia.pena@example.com | 48 | Salta |
| C0003 | Santiago Herrera | santiago.herrera@example.com | 40 | Salta |
| C0005 | Walter Gutiérrez | walter.gutierrez@example.com | 34 | Rosario |
| C0011 | Belén Torres | BELEN.TORRES@EXAMPLE.COM | 55 | Rosario |
| C0013 | Inés Herrera | ines.herrera.example.com | 30 | Rosario |
En la salida vas a ver gabriela ubeda en minúsculas y un correo en
mayúsculas. Está bien: este ejercicio selecciona, no limpia. Los
mismos datos, limpiados de verdad, son EJ-5.2.
Hasta hay dos correos sin arroba entre los 24 seleccionados, y también quedan: el correo no es una de las dos condiciones.
edad es un paso previo, no el ejercicio
edad llega como texto porque adentro hay una palabra y un guion. El
contrato te dice cómo convertirla -
pd.to_numeric(..., errors="coerce") - para que no tengas que
resolver eso acá.
Lo que sí es del ejercicio es la consecuencia: coerce deja
NaN, y un NaN no cumple between ni su
contrario. Esas dos filas se caen sin que nada avise, y sos vos quien tiene
que contarlas.