CODERWEEN 🎃

Aprovecha 50% OFF en CURSOS y CARRERAS

|

Hasta el 04/11 ⏰

CODERWEEN 🎃

Aprovecha 50% OFF en CURSOS y CARRERAS

|

Hasta el 04/11 ⏰

Hasta el 04/11 ⏰

CODERWEEN 🎃

Aprovecha 50% OFF en CURSOS y CARRERAS

Cursos

Empresas

¿Por qué Coder?

Cómo limpiar un dataset con Python y pandas: 8 problemas típicos y el código para resolver cada uno

Guía gratuita de empleabilidad

2026
Descargar la guía

Guía gratuita: IA en tu equipo

2026
Descargar la guía

Dan Patiño

AI Strategy & Innovation en Coderhouse

Data

Cómo limpiar un dataset con Python y pandas: 8 problemas típicos y el código para resolver cada uno

Cómo limpiar un dataset con Python y pandas: 8 problemas típicos y el código para resolver cada uno

Publicado el

Resumen ejecutivo

  • Casi todos los datasets reales traen los mismos ocho problemas: nombres de columnas desordenados, fechas como texto, números como texto, valores faltantes, filas duplicadas, textos inconsistentes, valores atípicos y categorías mal escritas.

  • Para cada problema hay dos o tres funciones clave: info, to_datetime, isna, fillna, drop_duplicates, str.strip y describe.

  • El tutorial empieza con una exploración inicial, resuelve los ocho problemas uno por uno y usa un ejemplo con datos de ventas desordenados, con código listo para copiar.

  • Documentar cada decisión de limpieza es tan importante como el código: es lo que te piden explicar en una entrevista de data.

Se dice mucho que un analista pasa la mayor parte de su tiempo limpiando datos, y cualquiera que haya trabajado con planillas reales lo confirma: fechas en tres formatos, montos guardados como texto, clientes repetidos con distinta mayúscula y celdas vacías. Pandas, la librería de Python más usada para trabajar con datos tabulares, tiene herramientas para resolver todo eso en pocas líneas. Si nunca usaste pandas, arrancá por nuestra guía completa de pandas para analistas de datos y después volvé a este paso a paso.

El dataset de ejemplo

Vamos a trabajar con un archivo ventas.csv con columnas fecha, cliente, producto, cantidad y monto. Tiene los problemas típicos: fechas como texto, montos con símbolo de peso, nombres de clientes con espacios de más, filas duplicadas y valores faltantes.

import pandas as pd

df = pd.read_csv("ventas.csv")
import pandas as pd

df = pd.read_csv("ventas.csv")
import pandas as pd

df = pd.read_csv("ventas.csv")
import pandas as pd

df = pd.read_csv("ventas.csv")

Antes de empezar: explorá sin tocar

Nunca limpies a ciegas. Primero mirá qué tenés:

df.head()          # primeras filas
df.info()          # tipos de datos y cantidad de valores no nulos
df.describe()      # estadísticas de las columnas numéricas
df.isna().sum()    # valores faltantes por columna
df.head()          # primeras filas
df.info()          # tipos de datos y cantidad de valores no nulos
df.describe()      # estadísticas de las columnas numéricas
df.isna().sum()    # valores faltantes por columna
df.head()          # primeras filas
df.info()          # tipos de datos y cantidad de valores no nulos
df.describe()      # estadísticas de las columnas numéricas
df.isna().sum()    # valores faltantes por columna
df.head()          # primeras filas
df.info()          # tipos de datos y cantidad de valores no nulos
df.describe()      # estadísticas de las columnas numéricas
df.isna().sum()    # valores faltantes por columna

Con info vas a ver, por ejemplo, que monto figura como object (texto) en lugar de número. Anotá cada problema que encuentres: esa lista es tu plan de limpieza.

Problema 1: nombres de columnas desordenados

Columnas como " Fecha de Venta" o "MONTO ($)" complican todo el código que sigue. Pasalas a minúsculas, sin espacios ni símbolos:

df.columns = (
    df.columns.str.strip().str.lower()
    .str.replace(" ", "_").str.replace(r"[^a-z0-9_]", "", regex=True)
)
df.columns = (
    df.columns.str.strip().str.lower()
    .str.replace(" ", "_").str.replace(r"[^a-z0-9_]", "", regex=True)
)
df.columns = (
    df.columns.str.strip().str.lower()
    .str.replace(" ", "_").str.replace(r"[^a-z0-9_]", "", regex=True)
)
df.columns = (
    df.columns.str.strip().str.lower()
    .str.replace(" ", "_").str.replace(r"[^a-z0-9_]", "", regex=True)
)

Problema 2: fechas guardadas como texto

Las fechas guardadas como texto no se pueden ordenar ni agrupar por mes. Convertilas con pd.to_datetime:

df["fecha"] = pd.to_datetime(df["fecha"], dayfirst=True, errors="coerce")
df["fecha"] = pd.to_datetime(df["fecha"], dayfirst=True, errors="coerce")
df["fecha"] = pd.to_datetime(df["fecha"], dayfirst=True, errors="coerce")
df["fecha"] = pd.to_datetime(df["fecha"], dayfirst=True, errors="coerce")

El parámetro dayfirst=True sirve para fechas en formato día/mes/año, y errors="coerce" convierte en vacío lo que no puede interpretar, en lugar de frenar el código.

Problema 3: números guardados como texto

Los montos con símbolo de peso o separador de miles se leen como texto. Sacá símbolos y separadores antes de convertir:

df["monto"] = (
    df["monto"].astype(str)
    .str.replace("$", "", regex=False)
    .str.replace(".", "", regex=False)
    .str.replace(",", ".", regex=False)
)
df["monto"] = pd.to_numeric(df["monto"], errors="coerce")
df["monto"] = (
    df["monto"].astype(str)
    .str.replace("$", "", regex=False)
    .str.replace(".", "", regex=False)
    .str.replace(",", ".", regex=False)
)
df["monto"] = pd.to_numeric(df["monto"], errors="coerce")
df["monto"] = (
    df["monto"].astype(str)
    .str.replace("$", "", regex=False)
    .str.replace(".", "", regex=False)
    .str.replace(",", ".", regex=False)
)
df["monto"] = pd.to_numeric(df["monto"], errors="coerce")
df["monto"] = (
    df["monto"].astype(str)
    .str.replace("$", "", regex=False)
    .str.replace(".", "", regex=False)
    .str.replace(",", ".", regex=False)
)
df["monto"] = pd.to_numeric(df["monto"], errors="coerce")

Problema 4: valores faltantes

No hay una única respuesta: depende de qué significa el dato que falta. La guía oficial de pandas sobre datos faltantes explica todas las opciones. Las más usadas:

# eliminar filas sin fecha o sin monto, porque no sirven para el análisis
df = df.dropna(subset=["fecha", "monto"])

# completar la cantidad faltante con 1 si sabés que es la regla del negocio
df["cantidad"] = df["cantidad"].fillna(1)
# eliminar filas sin fecha o sin monto, porque no sirven para el análisis
df = df.dropna(subset=["fecha", "monto"])

# completar la cantidad faltante con 1 si sabés que es la regla del negocio
df["cantidad"] = df["cantidad"].fillna(1)
# eliminar filas sin fecha o sin monto, porque no sirven para el análisis
df = df.dropna(subset=["fecha", "monto"])

# completar la cantidad faltante con 1 si sabés que es la regla del negocio
df["cantidad"] = df["cantidad"].fillna(1)
# eliminar filas sin fecha o sin monto, porque no sirven para el análisis
df = df.dropna(subset=["fecha", "monto"])

# completar la cantidad faltante con 1 si sabés que es la regla del negocio
df["cantidad"] = df["cantidad"].fillna(1)

Antes de completar con un promedio o un cero, preguntate si ese valor tiene sentido. Completar montos faltantes con el promedio, por ejemplo, puede inflar o distorsionar el total de ventas.

Problema 5: filas duplicadas

Las filas repetidas aparecen cuando se unen exportaciones o alguien carga dos veces el mismo dato. Usá drop_duplicates:

print(df.duplicated().sum())   # cuántas filas duplicadas hay
df = df.drop_duplicates()
print(df.duplicated().sum())   # cuántas filas duplicadas hay
df = df.drop_duplicates()
print(df.duplicated().sum())   # cuántas filas duplicadas hay
df = df.drop_duplicates()
print(df.duplicated().sum())   # cuántas filas duplicadas hay
df = df.drop_duplicates()

Si solo querés considerar duplicadas las filas con la misma fecha, cliente y producto, pasá esas columnas en el parámetro subset.

Problema 6: textos inconsistentes

"Juan Pérez", "juan pérez " y "JUAN PEREZ" son el mismo cliente para vos, pero no para pandas. Estandarizá:

df["cliente"] = df["cliente"].str.strip().str.title()
df["producto"] = df["producto"].str.strip().str.lower()
df["cliente"] = df["cliente"].str.strip().str.title()
df["producto"] = df["producto"].str.strip().str.lower()
df["cliente"] = df["cliente"].str.strip().str.title()
df["producto"] = df["producto"].str.strip().str.lower()
df["cliente"] = df["cliente"].str.strip().str.title()
df["producto"] = df["producto"].str.strip().str.lower()

Hacé este paso antes de buscar duplicados por cliente; si no, se te escapan repeticiones.

Problema 7: categorías mal escritas

Aunque normalices mayúsculas, pueden quedar variantes como "remera", "remeras" y "remra". Revisá los valores únicos y unificalos con un diccionario:

print(df["producto"].value_counts())
df["producto"] = df["producto"].replace({"remeras": "remera", "remra": "remera"})
print(df["producto"].value_counts())
df["producto"] = df["producto"].replace({"remeras": "remera", "remra": "remera"})
print(df["producto"].value_counts())
df["producto"] = df["producto"].replace({"remeras": "remera", "remra": "remera"})
print(df["producto"].value_counts())
df["producto"] = df["producto"].replace({"remeras": "remera", "remra": "remera"})

Problema 8: valores atípicos

Un monto de diez millones en una venta de una remera probablemente sea un error de carga. Mirá los extremos:

df["monto"].describe()
df.sort_values("monto", ascending=False).head(10)
df["monto"].describe()
df.sort_values("monto", ascending=False).head(10)
df["monto"].describe()
df.sort_values("monto", ascending=False).head(10)
df["monto"].describe()
df.sort_values("monto", ascending=False).head(10)

No borres automáticamente todo lo raro: puede ser una venta mayorista real. Revisá cada caso, consultá con quien conoce el negocio y documentá la decisión.

Guardá y documentá el resultado

df.to_csv("ventas_limpio.csv", index=False)
df.to_csv("ventas_limpio.csv", index=False)
df.to_csv("ventas_limpio.csv", index=False)
df.to_csv("ventas_limpio.csv", index=False)

Guardá el archivo limpio con otro nombre, nunca sobre el original. Y escribí un registro breve: cuántas filas tenía, cuántas quedaron, qué duplicados eliminaste y qué criterio usaste con los faltantes. En un notebook de Jupyter, eso puede ir en celdas de texto entre los pasos.

Practicá con datos reales

El portal datos.gob.ar publica conjuntos de datos abiertos que suelen necesitar limpieza, ideales para practicar. Te dejamos ideas de datasets públicos de Argentina para armar un proyecto de análisis. Y si tus archivos son muy grandes, mirá nuestra comparativa entre pandas, Polars y DuckDB.

Cursos recomendados de Coderhouse

Para dominar este flujo de limpieza, el curso de Python te da la base del lenguaje y la carrera de Data Analytics te enseña a limpiar, analizar y visualizar datos con proyectos reales. Si después querés automatizar estos procesos a escala, el curso de Data Engineering es el paso siguiente.

Preguntas frecuentes

¿Cuánto tarda limpiar un dataset? Depende del tamaño y del desorden. Un archivo chico se limpia en una hora; uno que combina varias fuentes puede llevar días. Por eso conviene guardar el código para reutilizarlo.

¿Es mejor eliminar o completar los valores faltantes? Depende de qué representa el dato y cuántos faltan. Si son pocos y la fila no sirve sin ese valor, eliminá; si hay una regla de negocio clara, completá.

¿Puedo limpiar datos con Excel en lugar de pandas? Sí, para archivos chicos. Pandas conviene cuando el archivo es grande o cuando tenés que repetir la limpieza cada semana.

¿La IA puede limpiar los datos por mí? Te puede sugerir código y detectar problemas, pero las decisiones (qué borrar, qué completar) tienen que ser tuyas, porque dependen del negocio.

Sobre el autor

Dan Patiño

Soy Dan Patiño, responsable de AI Strategy & Innovation en Coderhouse. Mi día a día consiste en fusionar la gestión táctica del e-commerce (CRO, Email Marketing y SEO) con el desarrollo de soluciones disruptivas. Me especializo en crear apps internas con IA para automatizar tareas y potenciar la innovación dentro del equipo. Creo fielmente que la tecnología es el mejor aliado de la estrategia. Para profundizar en mi recorrido profesional, te espero en mi perfil de LinkedIn.

Imagen promocionando quiz gratis de Coderhouse para encontrar tu formación.
Imagen promocionando quiz gratis de Coderhouse para encontrar tu formación.
Imagen promocionando quiz gratis de Coderhouse para encontrar tu formación.
Imagen promocionando quiz gratis de Coderhouse para encontrar tu formación.

NEWSLETTER

Suscríbete y mantente al día con las últimas noticias, ofertas exclusivas y recursos útiles directamente en tu correo.

Global

© 2026 Coderhouse. Todos los derechos reservados.

NEWSLETTER

Suscríbete y mantente al día con las últimas noticias, ofertas exclusivas y recursos útiles directamente en tu correo.

Global

© 2026 Coderhouse. Todos los derechos reservados.

NEWSLETTER

Suscríbete y mantente al día con las últimas noticias, ofertas exclusivas y recursos útiles directamente en tu correo.

Global

© 2026 Coderhouse. Todos los derechos reservados.

NEWSLETTER

Suscríbete y mantente al día con las últimas noticias, ofertas exclusivas y recursos útiles directamente en tu correo.

Global

© 2026 Coderhouse. Todos los derechos reservados.