Indice / Practicas / EJ-5.1
EJ-5.1 · Diagnostico por columna, sin corregir
Antes de arreglar nada hay que saber qué está roto y cuánto. Este ejercicio no corrige una sola celda: produce el informe que se mira antes de decidir qué hacer.
Qué hay que hacer
A partir de clientes_crudos.csv, producir
diagnostico_clientes.csv: una fila por cada columna del
archivo de entrada, con siete datos que describen su estado.
La regla que hace interesante al ejercicio: no se corrige nada. Ni se normaliza el texto, ni se convierten tipos, ni se descarta una fila. Solo se mide.
ELI5Explicado facil
Es la radiografía antes de la operación. El médico no arregla nada mirando la placa: cuenta cuántos huesos hay rotos y dónde. Recién con eso decide qué hacer.
Acá es igual: seis filas, una por columna, que dicen cuántos datos faltan, cuántos valores distintos hay y cuál es el que más se repite.
Archivos
- Entrada ·
clientes_crudos.csv - Objetivo ·
diagnostico_clientes.csv - Herramienta ·
comparar.py
La trampa, dicha de entrada
Dos de las siete columnas del informe cuentan lo mismo - los datos ausentes - y tienen que dar distinto en una de las seis filas. Eso no es un error: es el resultado del ejercicio.
Si te dan iguales las seis veces, no leíste el archivo de las dos formas que hay que leerlo. Y si te dan distintas en más de una fila, estás contando de más.
Cómo saber si te salió
python comparar.py mi_salida.csv diagnostico_clientes.csv
Si no dice nada, tu archivo es idéntico al esperado. Si difiere, te dice qué fila y qué columna. No hay nota ni entrega: es para vos.
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
diagnostico_clientes.csv · 6 filas
| Columna | Tipo | Que lleva |
|---|---|---|
columna | texto | El nombre de la columna diagnosticada |
tipo_leido | texto | El dtype que pandas le asigno con read_csv sin opciones, como texto: str, int64, float64 |
ausentes_por_defecto | entero | isna().sum() sobre la lectura sin opciones |
ausentes_declarando_tokens | entero | isna().sum() sobre la lectura con na_values=['NaN', 'N/A', 'null', '-'] |
distintos | entero | Cuantos valores distintos hay, sobre el texto crudo y sin contar el campo vacio |
mas_frecuente | texto | El valor no vacio que mas se repite, tal cual viene en el archivo |
veces | entero | Cuantas veces aparece ese valor |
Que hacer con cada defecto
| Defecto | Donde | Accion | Adonde va |
|---|---|---|---|
| el token '-' en la columna edad | 1 fila | NO NO corregir. Contarlo en ausentes_declarando_tokens y no en ausentes_por_defecto | diagnostico_clientes.csv: la diferencia entre las dos columnas es el resultado del ejercicio |
| campos vacios (nombre, correo, ciudad, edad) | 6 celdas en total: 2 en nombre, 2 en correo, 1 en edad y 1 en ciudad | NO NO corregir. Se cuentan como ausentes, y no compiten por mas_frecuente | diagnostico_clientes.csv |
| nombres con espacios de mas y correos en mayusculas | cada 7 y cada 11 filas | NO NO normalizar. Solo se le saca el espacio de los extremos para contar; el valor se informa tal cual vino | diagnostico_clientes.csv |
| empates en el valor mas repetido | en id empatan las 120 filas; en nombre, correo y fecha_alta empatan varios | desempatar desempatar por el valor que ordena primero (orden de Python, por codigo de caracter) | diagnostico_clientes.csv |
Una fila puede tener mas de un problema. Se informa solo el primero de esta lista:
- leer sin opciones para obtener tipo_leido y ausentes_por_defecto
- leer con na_values para obtener ausentes_declarando_tokens
- leer como texto puro para contar distintos y buscar mas_frecuente
Las tres lecturas son independientes: se pueden hacer en cualquier orden. Lo que NO se puede es contestar las siete columnas con una sola lectura, y darse cuenta de eso es el ejercicio.
Conteos clave
| filas de entrada | 120 |
|---|---|
| diagnostico_clientes.csv | 6 |
| columnas leidas como texto | 6 |
| columnas donde las dos cuentas de ausentes difieren | 1 |
| diferencia total entre ambas cuentas | 1 |
| por motivo |
Invariantes
Comprobaciones que tu resultado tiene que cumplir. Corrilas vos mismo antes de comparar los archivos:
len(diagnostico) == 6
diagnostico['columna'].is_unique
(diagnostico['ausentes_declarando_tokens'] >= diagnostico['ausentes_por_defecto']).all()
(diagnostico['veces'] >= 1).all()
(diagnostico['distintos'] <= 120).all()
(diagnostico['mas_frecuente'].str.strip() != '').all()
diagnostico.loc[diagnostico['columna'] == 'id', 'distintos'].item() == 120
PISTASSi te trabas, abri esto
- El guion no es un token de ausente para pandas. Esa sola fila es toda la diferencia entre las dos columnas de conteo.
- Con dtype=str y keep_default_na=False no se pierde ningun token: los campos vacios quedan como cadena vacia, no como NaN.
- value_counts() ordena por cantidad, pero cuando hay empate el orden no es una decision tuya: hay que desempatar a mano.
- En pandas 3 el dtype de una columna de texto se escribe str, no object. Si tu tipo_leido dice object, estas mirando documentacion vieja.
Así tiene que quedar
| columna | tipo_leido | ausentes_por_defecto | ausentes_declarando_tokens | distintos | mas_frecuente | veces |
|---|---|---|---|---|---|---|
| ciudad | str | 1 | 1 | 10 | Rosario | 21 |
| correo | str | 2 | 2 | 111 | carla.suarez@example.com | 2 |
| edad | str | 3 | 4 | 58 | -5 | 5 |
| fecha_alta | str | 0 | 0 | 110 | 0000-00-00 | 2 |
| id | str | 0 | 0 | 120 | C0001 | 1 |
value_counts
En la columna id los 120 valores aparecen una vez cada uno: empatan
todos. En nombre, correo y fecha_alta también
hay empates. Cuál gana es una decisión tuya, no de pandas, y el
contrato la fija: entre los que empatan, el que ordena primero.
Es la primera vez en el curso que aparece esta idea, y va a volver en cada ejercicio que ordene algo: si dos resultados correctos pueden diferir, falta una regla de desempate.
¿Se puede contestar las siete columnas del informe con una sola lectura del archivo? Contestá eso primero. La respuesta cambia por completo cómo se escribe la solución.