¿Qué reviso en una tabla antes de limpiarla? Haz el inventario de problemas
Revisa la hoja de ventas completa con cinco miradas que no cambian nada, y escribe la lista de lo que hay que arreglar antes de arreglar algo.
Curso gratis. Tu Maestro, una IA, .
Antes de arreglar algo, haz la lista completa de lo que está mal. Suena lento, y es justo lo que te ahorra tiempo: si arreglas lo primero que ves, vas a descubrir el siguiente problema con el reporte ya enviado. Y a veces un arreglo esconde otro problema: si llenas los huecos con cero antes de contarlos, ya no sabes cuántos faltaban.
Mirar no cambia nada. Ninguna de las líneas de esta página modifica la tabla; solo le hacen preguntas. Por eso puedes correrlas todas las veces que quieras, en cualquier orden, sin miedo.
En pandas, la hoja completa de marzo es un DataFrame que aquí se llama ventas. Estas son las cinco miradas, cada una con la línea que la hace:
Tamaño y tipos
ventas.shapedice cuántas filas y columnas hay, yventas.dtypesde qué tipo es cada columna. Una columna de dinero de tipostres texto, aunque se vea como número.Huecos por columna
ventas.isna().sum()cuenta las celdas vacías de cada columna. Un hueco todavía no es un error: falta averiguar qué quiere decir.Valores de las columnas de texto
ventas["ciudad"].value_counts(dropna=False)lista cada valor con cuántas veces aparece, huecos incluidos. Ahí salen las variantes, los espacios y las abreviaturas.Mínimo y máximo de los números
ventas["kilos"].describe()da el conteo, el mínimo, el máximo y los cuartiles. Un mínimo negativo o un máximo enorme son la primera pista de un valor imposible.Lo que debería ser único
Un folio identifica una venta.
ventas["folio"].duplicated().sum()cuenta cuántas veces aparece un folio de más.
Así salió el inventario de la hoja de marzo. Corrimos estas líneas en el sandbox de Maestro, sobre los 60 renglones:
ventas = dataprint(ventas.shape)print(ventas.dtypes)print(ventas.isna().sum())print(ventas["kilos"].describe())print(ventas["folio"].duplicated().sum())(60, 9)captura int64folio strfecha strcliente strciudad strproducto strkilos float64monto strdescuento float64dtype: objectcaptura 0folio 0fecha 0cliente 0ciudad 0producto 0kilos 1monto 1descuento 44dtype: int64count 59.000000mean 252.949153std 1292.906435min -12.00000025% 28.00000050% 53.00000075% 159.000000max 9999.000000Name: kilos, dtype: float642Léelo como una lista de pendientes, de arriba hacia abajo:
- 60 filas y 9 columnas. Es el número contra el que vas a comparar cada paso de la limpieza.
montoesstr. Los montos son texto: no puedes sumarlos todavía. Lo arreglas en el módulo 2.- Huecos: 1 en
kilos, 1 enmontoy 44 endescuento. Antes de llenar o borrar cualquiera, hay que saber qué quiere decir cada uno (la página siguiente). kilosva de -12 a 9999. La mediana es 53, así que esos dos extremos no se parecen a nada más de la hoja. El promedio, 252.9, ya está contaminado por ellos.- 2 folios de más. Hay ventas que aparecen dos veces, o algo que se parece.
Fíjate en lo que no hiciste: no borraste el -12, no llenaste los huecos, no quitaste los folios repetidos. Solo los anotaste. La lista completa te deja decidir con calma y preguntar todo de una vez, en lugar de mandarle a Marisol cinco mensajes sueltos.
Y fíjate también en lo que este inventario no ve: las 12 formas de escribir 4 ciudades salen solo cuando cuentas los valores de ciudad, que es lo que vas a hacer tú.
Inténtalo
Completa el inventario con la mirada que falta. Si una salida no te queda clara, pídele a tu Maestro que te la lea renglón por renglón.
Tu turno
Agrega las miradas a las columnas de texto: value_counts(dropna=False) para ciudad y para producto, y también para descuento. Después, en los comentarios del final, escribe tu lista de problemas, uno por línea. Terminaste cuando ves las 12 formas de escribir la ciudad y tu lista tiene al menos seis problemas.
Datos: ventas-cooperativa, 60 filas
| Fila | Quitar | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | ||||||||||
| 2 | ||||||||||
| 3 | ||||||||||
| 4 | ||||||||||
| 5 | ||||||||||
| 6 | ||||||||||
| 7 | ||||||||||
| 8 | ||||||||||
| 9 | ||||||||||
| 10 | ||||||||||
| 11 | ||||||||||
| 12 | ||||||||||
| 13 | ||||||||||
| 14 | ||||||||||
| 15 | ||||||||||
| 16 | ||||||||||
| 17 | ||||||||||
| 18 | ||||||||||
| 19 | ||||||||||
| 20 |
Enter guarda; Esc deshace; vacía es un valor faltante
Tab agrega sangría; Esc y Tab para salir
Los huecos que isna() no cuenta
isna() cuenta solo lo que pandas ya reconoce como vacío. Al abrir un CSV, pandas lee como vacío la celda sin nada y también textos como "N/A" o "NULL" (la documentación de read_csv dice cuáles). Pero un espacio solo, un guion o un "sin dato" siguen siendo texto: para pandas son un valor más.
Lo probamos en el sandbox con una columna de cinco celdas capturadas de cinco formas: una vacía, una con "N/A", una con un espacio, una con un guion y una con un 5. isna().sum() contó 2 huecos, y la columna entera se quedó como texto (str) en lugar de volverse número. Los otros dos "huecos" solo aparecieron en value_counts(dropna=False), como un espacio y un guion.
Por eso el inventario incluye value_counts aunque la columna parezca numérica. Si una columna de números sale como str, o value_counts muestra un "-", hay huecos disfrazados que isna() no vio. Anótalos igual que los demás y pregunta qué quieren decir.
¿Tu hoja usa un guion, "s/d" o "sin dato" para decir que falta algo? Cuéntale a tu Maestro cómo aparece.
Qué hacer con la lista
La lista no la resuelves toda tú. Sepárala en dos columnas: lo que puedes decidir solo (que "puebla" es Puebla, que el espacio de "cdmx " sobra) y lo que necesita a quien conoce los datos (qué quiere decir un descuento vacío, qué pasó con los -12 kilos, si "Oaxaca" es la capital). Esa segunda columna es la más importante del inventario, y de ella se trata la página siguiente.
Si no sabes si un problema de tu lista lo decides tú o alguien más, pregúntale a tu Maestro.
Comprueba lo que sabes: El inventario dice que kilos va de -12 a 9999. ¿Qué haces con esas dos ventas en este momento?