Saltar al contenido

Indice / Practicas / EJ-5.1

EJ-5.1 · Diagnostico por columna, sin corregir

Practica de: 5.1 Diagnostico antes de tocar nadaDificultad: B

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

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

clientes_crudos.csv (entrada) · 120 filas, se muestran 5
idnombrecorreoedadciudadfecha_alta
C0001José Pazjose.paz@example.com62Salta2025-02-20
C0002Lucía Peñalucia.pena@example.com48Salta2025-01-05
C0003Santiago Herrerasantiago.herrera@example.com40Salta2024-05-12
C0004José Rodríguezjose.rodriguez@example.com67Paraná2024-08-11
C0005Walter Gutiérrezwalter.gutierrez@example.com34Rosario2026-01-01

El contrato de salida

diagnostico_clientes.csv · 6 filas

ColumnaTipoQue lleva
columnatextoEl nombre de la columna diagnosticada
tipo_leidotextoEl dtype que pandas le asigno con read_csv sin opciones, como texto: str, int64, float64
ausentes_por_defectoenteroisna().sum() sobre la lectura sin opciones
ausentes_declarando_tokensenteroisna().sum() sobre la lectura con na_values=['NaN', 'N/A', 'null', '-']
distintosenteroCuantos valores distintos hay, sobre el texto crudo y sin contar el campo vacio
mas_frecuentetextoEl valor no vacio que mas se repite, tal cual viene en el archivo
vecesenteroCuantas veces aparece ese valor

Orden de las filas: columna ascendente. Es unico, asi que no hace falta desempate. Indice: no se escribe: to_csv(index=False)

Que hacer con cada defecto

DefectoDondeAccionAdonde va
el token '-' en la columna edad1 filaNO NO corregir. Contarlo en ausentes_declarando_tokens y no en ausentes_por_defectodiagnostico_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 ciudadNO NO corregir. Se cuentan como ausentes, y no compiten por mas_frecuentediagnostico_clientes.csv
nombres con espacios de mas y correos en mayusculascada 7 y cada 11 filasNO NO normalizar. Solo se le saca el espacio de los extremos para contar; el valor se informa tal cual vinodiagnostico_clientes.csv
empates en el valor mas repetidoen id empatan las 120 filas; en nombre, correo y fecha_alta empatan variosdesempatar desempatar por el valor que ordena primero (orden de Python, por codigo de caracter)diagnostico_clientes.csv
Orden de comprobacion

Una fila puede tener mas de un problema. Se informa solo el primero de esta lista:

  1. leer sin opciones para obtener tipo_leido y ausentes_por_defecto
  2. leer con na_values para obtener ausentes_declarando_tokens
  3. 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

Si estos numeros no te dan, algo se desvio antes de que llegues a comparar los archivos.

filas de entrada120
diagnostico_clientes.csv6
columnas leidas como texto6
columnas donde las dos cuentas de ausentes difieren1
diferencia total entre ambas cuentas1
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

diagnostico_clientes.csv (objetivo) · 6 filas, se muestran 5
columnatipo_leidoausentes_por_defectoausentes_declarando_tokensdistintosmas_frecuenteveces
ciudadstr1110Rosario21
correostr22111carla.suarez@example.com2
edadstr3458-55
fecha_altastr001100000-00-002
idstr00120C00011
El empate no lo puede resolver 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.

Una pregunta para pensar antes de escribir código

¿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.