Cargando tu progreso…

Pokédex Codex

pandas: Limpieza de datos

META

🎯 Meta: arreglar datos sucios. En la vida real ningún dataset viene perfecto: faltan valores, hay duplicados, tipos mal. Limpiar es el paso que nadie ve pero todos necesitan.

Los datos reales son un desastre: un Pokémon sin nivel cargado, filas repetidas, números guardados como texto. Antes de analizar, hay que limpiar.

🕳️ Datos faltantes (NaN)

Un valor que falta aparece como NaN (Not a Number). pandas tiene herramientas para detectarlos y tratarlos.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    "nombre": ["Pikachu", "Charizard", "Bulbasaur"],
    "nivel":  [25, np.nan, 12],
})
print(df.isna())            # True donde falta
print("faltan:", df.isna().sum().sum())   # cuántos NaN en total
P: ¿Qué función de pandas se usa para detectar valores faltantes en un DataFrame?
- `df.null()`
+ `df.isna()`
- `df.empty()`
> `df.isna()` devuelve un DataFrame de `True/False`: `True` donde falta un valor (`NaN`). `.isna().sum()` cuenta cuántos hay por columna.

Rellenar o eliminar

import pandas as pd
import numpy as np
df = pd.DataFrame({"nombre": ["A", "B", "C"], "nivel": [25, np.nan, 12]})

print(df.fillna(0))    # rellena los NaN con 0
print(df.dropna())     # elimina las filas que tengan algún NaN
CUIDADO

⚠️ fillna y dropna devuelven una copia; no cambian el original salvo que se lo asignes (df = df.dropna()).

P: `df.fillna(0)` y `df.dropna()`: ¿cuál es la diferencia principal?
- `fillna` borra filas; `dropna` las rellena.
- Son iguales, solo cambia el nombre.
+ `fillna` reemplaza los `NaN` con un valor; `dropna` elimina las filas que los tienen.
> `fillna(0)` pone 0 donde había `NaN`. `dropna()` directamente saca esas filas. Ninguna modifica el original: devuelven una copia.

🔢 Tipos de datos

A veces un número viene como texto. Lo convertís con .astype().

import pandas as pd
s = pd.Series(["25", "90", "12"])
print(s.astype(int) + 5)   # ahora sí podés sumar -> 30 95 17

👯 Duplicados

import pandas as pd
df = pd.DataFrame({"nombre": ["Pikachu", "Pikachu", "Eevee"]})
print(df.drop_duplicates())   # saca filas repetidas

✏️ Renombrar columnas

import pandas as pd
df = pd.DataFrame({"hp": [35, 78]})
print(df.rename(columns={"hp": "vida"}))

🔤 Texto y transformaciones

.str te da métodos de string para toda la columna; .apply() aplica una función a cada valor.

import pandas as pd
nombres = pd.Series(["pikachu", "charizard"])
print(nombres.str.upper())          # PIKACHU CHARIZARD
print(nombres.str.len())            # largo de cada nombre

niveles = pd.Series([25, 90, 12])
print(niveles.apply(lambda x: x * 2))   # función propia a cada valor

📝 Resumen

CosaPara qué
df.isna() / .isna().sum()encontrar y contar faltantes
df.fillna(v)rellenar NaN
df.dropna()eliminar filas con NaN
s.astype(int)cambiar el tipo
df.drop_duplicates()sacar filas repetidas
df.rename(columns={...})renombrar columnas
s.str.upper(), s.apply(f)transformar texto / aplicar función

➡️ ¿Y ahora qué?

Practicá con los ejercicios de este tema. 💪

ÁNIMO

“Datos limpios, conclusiones confiables. Datos sucios, mentiras prolijas.”