9 · Caso práctico: limpieza del dataset Google Play Store
Enfrenta los numéricos almacenados como strings, unidades mixtas y duplicados que hacen inútil `df.describe()` — y construye un DataFrame completamente numérico listo para análisis.
Los CSVs del mundo real son sucios — numéricos almacenados como strings, unidades inconsistentes, categóricos resistentes al parseo. Limpiar es la mitad del EDA.
Sin esto:
Sin limpieza, `df.describe()` no da nada sobre la columna 'Size' porque se almacena como '19M', '85k', 'Varies with device'.
Todo principiante de Kaggle tiene un momento en el que descarga un CSV "real", ejecuta df.describe(), y no ve casi nada útil — porque la mitad de las columnas numéricas se almacenan como dtype object.
El dataset de Google Play Store es la lección que humilló a la mayoría de los principiantes de ciencia de datos. Su columna Size contiene valores como '19M', '85k' y 'Varies with device'. Su columna Installs dice '1,000,000+'. Su columna Price almacena '$4.99' para apps de pago y '0' para gratuitas.
Ninguno de estos es numérico. Ninguno es directamente utilizable. Esta lección muestra el pipeline completo de limpieza de datos:
- Detectar problemas de tipo con
df.dtypes - Parsear numéricos almacenados como strings columna por columna
- Estandarizar unidades (M → bytes, k → bytes)
- Manejar valores centinela (
'Varies with device'→NaN) - Eliminar duplicados exactos
- Guardar el DataFrame limpio
La disciplina clave: nunca mutar el DataFrame original durante la limpieza. Siempre crear columnas nuevas o trabajar en un df.copy().
Python (in browser)
`df.dtypes` es el primer diagnóstico — revela que `Size`, `Installs` y `Price` son `object` cuando deberían ser numéricos. `df.describe()` en estas columnas produce un resumen categórico (count/unique/top/freq) en lugar del resumen de cinco números. Estas son las columnas que necesitan limpieza.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`parse_size` maneja los tres casos: 'M' (megabytes → bytes), 'k' (kilobytes → bytes), 'Varies with device' → `NaN`. Aplicarlo con `.apply()` crea una columna limpia `size_bytes` sin tocar el `Size` original.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`.str.replace(',','').str.replace('+','').astype(int)` — una cadena de tres pasos que elimina los caracteres de formato y convierte a int. Este patrón se generaliza a cualquier columna de string 'número-con-sufijo'.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`.str.replace('$','').astype(float)` elimina el símbolo de moneda y convierte a float. `drop_duplicates(subset=['App'], keep='first')` elimina filas duplicadas exactas — siempre especifica `subset` para deduplicar solo en las columnas clave que te importan.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
La lista de verificación de limpieza de seis pasos como comentario de código reutilizable. Cada paso es una transformación distinta y reversible aplicada a columnas nuevas — nunca a las originales. Determinista + re-ejecutable = ETL listo para producción.
Una columna 'Installs' tiene los valores `'1,000,000+'` y `'10,000+'`. ¿Cuál es la cadena de pandas más simple para convertir ambos a enteros?
- `df.dtypes` es el punto de entrada de la limpieza — cualquier columna numérica almacenada como `object` necesita parseo antes del análisis o modelado.
- Las cadenas del accessor `.str` — `.str.replace().str.replace().astype()` — son el patrón estándar de pandas para limpiar strings formateados como `'1,000,000+'` o `'$4.99'`.
- Los strings centinela (`'Varies with device'`, `'Unknown'`, `'N/A'`) deben mapearse a `np.nan` para que los imputadores y `.fillna()` posteriores puedan manejarlos de forma uniforme.
- Nunca mutes las columnas originales durante la limpieza — crea columnas nuevas y mantén las crudas como rastro de auditoría. La cadena de limpieza debe ser determinista y re-ejecutable.
Los scrapers web, volcados de API y exportaciones de CRM tienen tipo 'object' en la mitad de sus columnas; la limpieza es la puerta por la que pasa todo científico de datos. Los pipelines ETL codifican la lógica de limpieza para que la misma transformación cruda → limpia se ejecute cada noche.
Si lo quitas: Entrenaría un modelo con el string literal 'Varies with device' y produciría silenciosamente resultados basura.