Cómo armar un skill de Claude Code que analiza un dataset sucio, propone reglas de limpieza como código revisable y se niega a eliminar filas en silencio, para que el export del mes que viene pase por el mismo pipeline y no por una sesión de chat nueva.

En resumen
- Un skill de limpieza de datos convierte un archivo crudo en dos artefactos: un perfil y un script de limpieza reproducible, nunca una transformación de una sola vez que se pierde en el chat.
- Se activa con cualquier CSV nuevo, export o tabla scrapeada, y el primer paso siempre es analizar, nunca transformar.
- Cada regla que elimina o cambia filas tiene que imprimir un conteo. La pérdida silenciosa de filas es el bug de datos clásico.
- ¿Una regla elimina más de un porcentaje mínimo de filas? El skill se detiene y pregunta en vez de adivinar.
- Lo que te queda es un script en control de versiones, así el pipeline sobrevive a la conversación.
Limpiar datos dentro de una ventana de chat se siente productivo, pero es una trampa. Pegas un CSV, el asistente arregla las fechas, elimina los duplicados y te devuelve una tabla limpia. Un mes después llega el export otra vez, un poco distinto, y nada de ese trabajo quedó en ningún lado donde puedas volver a ejecutarlo. Un skill de limpieza de datos resuelve el problema de fondo: en vez de producir una tabla limpia, produce el código que produce una tabla limpia, más un perfil que explica qué estaba mal desde el principio. Al terminar vas a saber exactamente cuándo debe activarse el skill, cómo funciona por dentro y la única salvaguarda que separa un skill útil de una máquina silenciosa de corromper datos.
El skill es la diferencia entre "te limpié los datos" y "aquí está el script que limpia estos datos, siempre, y que puedes leer, versionar y volver a ejecutar". Lo primero es un favor. Lo segundo es un activo.
01 · Qué hace el skill en realidad
Un skill de limpieza de datos es una capacidad empaquetada que le das a Claude Code: una descripción corta, un conjunto de instrucciones y un contrato para su salida. Cuando se activa, toma un archivo tabular crudo y devuelve dos cosas, un perfil de los datos y un script de limpieza, y nada más. No te entrega una tabla transformada pegada en el chat. El entregable es código reproducible.
El perfil es el diagnóstico. Reporta el conteo de filas y columnas, los tipos inferidos por columna, la tasa de nulos por columna, cuántas filas están completamente duplicadas y una muestra de los valores raros que no cuadran (un texto en una columna numérica, una fecha en tres formatos distintos, una celda vacía que en realidad contiene el texto literal "NA"). El script de limpieza es la receta: una regla por problema, cada una escrita para que un humano la lea en un diff y diga "sí, elimina esas" o "no, eso está mal".
La palabra clave es reproducible. Una transformación hecha una sola vez en el chat se pierde apenas la conversación avanza. Un script vive en el repo, corre en CI o en un cron, y convierte "limpiar los datos" de una tarea recurrente en un pipeline que ya existe.
Nota
Un skill no es un modelo más inteligente: es un modelo con una descripción de puesto y un contrato. El valor está en que se comporta igual cada vez que se activa, así dejas de reexplicar "analiza primero, después propón reglas" en cada archivo nuevo.
02 · Cuándo debe activarse
El disparador es amplio a propósito: cualquier archivo tabular nuevo que entra al proyecto. Un CSV que alguien dejó en una carpeta, un export de Supabase, una tabla scrapeada, una hoja de cálculo que te mandó un cliente por correo. Si tiene filas y columnas y todavía no confías en él, el skill debe activarse.
Una buena descripción del skill hace que ese disparo sea confiable. Esta es la forma que uso; la descripción es lo que Claude Code lee para decidir si este skill aplica:
---
name: data-cleaning
description: >
Profile and clean a raw tabular dataset (CSV, TSV, Excel export,
scraped table). Use whenever a new or untrusted data file enters
the project and needs profiling, deduping, type-fixing, or
null-handling BEFORE analysis. Produces a profile + a reproducible
cleaning script, never a one-off transform.
---
When invoked:
1. Profile FIRST. Do not transform anything yet.
2. Show the profile, then propose rules as code, one per problem.
3. Every destructive rule must print how many rows it drops/changes.
4. If a rule drops more than ~5% of rows, STOP and ask the user.
La descripción es la que hace el trabajo de verdad. Fíjate en lo que incluye: los tipos de archivo, los verbos (analizar, deduplicar, arreglar tipos, manejar nulos), la palabra que marca el momento, BEFORE analysis, y lo que produce. Una descripción vaga como "limpia datos" o nunca se activa o se activa con todo. Sé específico con el cuándo.
Consejo
Si tu skill se activa con demasiada facilidad, el arreglo casi siempre está en la descripción, no en la lógica. Define también lo que NO debe cubrir ("no para datos ya limpios, no para hacer joins de tablas") y los falsos positivos caen rápido.
03 · Cómo funciona por dentro
El skill corre en dos fases estrictas. La fase uno analiza y no toca los datos. Este orden es la clave de todo el diseño: no puedes proponer una regla de limpieza sensata hasta que viste la forma del desorden, y un agente que transforma primero va a "arreglar" con toda confianza una columna que nunca entendió.
Fase uno: analiza, no transformes
import pandas as pd
df = pd.read_csv("raw_export.csv", dtype=str) # léelo como texto; infiere después
print("rows, cols:", df.shape)
print("\nnull rate per column:")
print(df.isna().mean().sort_values(ascending=False))
print("\nfully duplicate rows:", df.duplicated().sum())
# saca a la luz los valores raros antes de decidir nada
for col in df.columns:
sample = df[col].dropna().unique()[:8]
print(col, "->", sample)
Leer todo como texto primero es deliberado. Si dejas que pandas infiera los tipos al cargar, hace coerción en silencio y pierdes la evidencia, que es justo lo que el perfil debería revelar. Los tipos los decides después de mirar.
Fase dos: propón reglas como código
Solo después del perfil el skill escribe reglas de limpieza. Cada una es pequeña, lleva el nombre del problema que resuelve y, esto es lo crítico, reporta su impacto.
before = len(df)
# 1. duplicados exactos
df = df.drop_duplicates()
print(f"deduped: {before - len(df)} rows removed")
# 2. arregla la columna de dinero: quita comas, convierte a float
df["amount"] = (
df["amount"].str.replace(",", "", regex=False).astype("float64")
)
# 3. id es requerido: registra cuántas filas no tienen id antes de botarlas
missing_id = df["id"].isna().sum()
print(f"rows with no id (will drop): {missing_id}")
df = df.dropna(subset=["id"])
Tres cosas hacen que esto sea un activo y no un truco de magia. Se lee de arriba abajo como un checklist. Cada paso destructivo imprime un conteo, así el diff queda auditable. Y vive en un archivo al que le haces commit, así el export del mes que viene pasa por exactamente el mismo pipeline, y si el archivo nuevo rompe una regla, te enteras al ejecutarlo, no en un reporte tres semanas después.
04 · Una invocación concreta
Digamos que un proveedor te manda payments_may.csv por correo. Lo dejas en el proyecto y le pides a Claude Code que lo limpie. El skill se activa y la primera respuesta es un perfil, no un resultado:
PROFILE: payments_may.csv
rows, cols: (4,812, 6)
null rate per column:
notes 0.71
amount 0.04
id 0.02
date 0.00
fully duplicate rows: 38
weird values:
amount -> ['1,250.00', '980', '', '3,400.50', 'N/A']
date -> ['2026-05-01', '05/02/2026', '2026-05-03']
Proposed rules (review before I run them):
1. drop 38 exact duplicates
2. amount: strip commas, treat 'N/A' and '' as null, coerce to float
3. date: normalize mixed formats to ISO (YYYY-MM-DD)
4. id: required. would drop ~96 rows (2%). OK to proceed?
Lo lees y dices "sí, pero las filas sin id guárdalas en un archivo de cuarentena aparte en vez de eliminarlas", y el skill ajusta el script. La salida es clean_payments.py más un resumen de una línea de lo que hizo cada regla. La ejecutas con el archivo de junio el mes que viene y simplemente funciona, o se detiene en una regla que ya no se cumple, que es exactamente la señal que quieres.
05 · Configuración y trampas
El skill tiene un par de parámetros que vale la pena fijar explícitamente en vez de dejarlos al azar:
- El umbral de descarte. El default "detente y pregunta si una regla elimina más de ~5%" es solo un punto de partida. Para una tabla scrapeada y ruidosa, 5% es normal y vas a quererlo más alto; para un export financiero, cualquier descarte sin explicar debería frenar el proceso. Ajústalo por proyecto.
- Cuarentena en vez de borrar. Para datos importantes, mejor escribe las filas descartadas en un archivo aparte en lugar de borrarlas. "Eliminamos 96 filas" está bien; "aquí están las 96 filas que eliminamos, échales un ojo" está mejor.
- La inferencia de tipos viene apagada. Lee como texto y decide los tipos de forma deliberada. La inferencia automática es donde las fechas se vuelven strings, los ceros a la izquierda desaparecen de los códigos postales y los IDs se redondean a floats.
Atención
El bug de datos clásico es la pérdida silenciosa de filas. Una regla elimina filas sin avisar, nadie se da cuenta, y tres reportes después los totales están mal y no tienes idea de qué paso se comió los datos. Haz que cada regla destructiva imprima un conteo, y que cualquier descarte grande se detenga y pregunte. Un script de limpieza que borra sin reportar no es una funcionalidad: es un pasivo con buenas intenciones.
Una última concesión honesta: este skill es más lento que arreglar la tabla a mano en el chat. Analizar primero, narrar cada descarte y escribir un script al que le puedas hacer commit cuesta más turnos al inicio. Para un archivo desechable de cinco filas, eso es exagerado: límpialo a mano. El skill vale la pena con datos que se repiten o sobre los que alguien va a tomar una decisión. Si no es ninguno de los dos, no lo necesitas.
Un skill de limpieza de datos es algo pequeño que te cambia un hábito: te frena de hacer trabajo invisible en una ventana de chat y te pone a construir un pipeline que puedes leer, versionar y en el que confiar. El perfil te mantiene honesto sobre qué estaba mal de verdad, y la salvaguarda del conteo de filas te mantiene honesto sobre qué descartaste. Constrúyelo una vez, apúntalo al próximo export desordenado, y la limpieza deja de ser una tarea y se vuelve código.
Puntos clave
- Entrega código, no una tabla: el entregable del skill es un perfil más un script de limpieza reproducible al que le haces commit, no una transformación de una sola vez en el chat.
- Analiza primero, siempre: no puedes proponer una regla sensata hasta que viste la forma del desorden, y leer como texto mantiene la evidencia intacta.
- Haz que las reglas destructivas se delaten: cada descarte imprime un conteo y un descarte grande se detiene y pregunta. La pérdida silenciosa de filas es el bug que te explota tres reportes después.
- La descripción es el disparador: verbos específicos, tipos de archivo y los casos que quedan fuera bien explícitos hacen que el skill se active cuando debe y se quede quieto cuando no.
- Sáltatelo con archivos desechables. El skill solo vale la pena con datos que se repiten o sobre los que alguien va a tomar una decisión.
Preguntas frecuentes
¿Por qué no dejar que el asistente limpie la tabla directo en el chat?
Porque ese trabajo desaparece apenas la conversación avanza, y el export del mes que viene, un poco distinto, hay que limpiarlo de nuevo a mano desde cero. Un skill produce un script al que le haces commit, así el segundo, tercer y duodécimo archivo pasan por el mismo pipeline. El chat responde la pregunta una vez; el script la responde siempre y te avisa cuando el archivo nuevo rompe una suposición.
¿Cuál es la salvaguarda más importante que hay que dejar puesta?
Haz que cada regla destructiva imprima cuántas filas elimina o cambia, y que cualquier descarte grande se detenga y pregunte antes de seguir. La pérdida silenciosa de filas es el bug de datos que te explota tres reportes después, cuando los totales están mal y no puedes saber qué paso se comió las filas. Un conteo por regla lo convierte en algo que detectas en el diff.
Mi skill se activa con datos que ya están limpios. ¿Cómo lo arreglo?
Casi siempre es la descripción, no la lógica. Aprieta el 'cuándo' y deja claro también lo que NO debe cubrir: di que es para archivos nuevos o no confiables ANTES del análisis, y que NO es para datos ya limpios ni para hacer joins de tablas. Las descripciones específicas, con los casos que quedan fuera bien explícitos, cortan los falsos positivos rápido. El disparo es más un problema de redacción que de ingeniería.
¿Por qué leer todo el archivo como texto primero en vez de dejar que pandas infiera los tipos?
Porque la inferencia automática destruye la evidencia antes de que puedas verla. Convierte fechas de formato mixto en strings, le quita los ceros a la izquierda a los códigos postales y redondea IDs largos a floats, todo en silencio. Leer como texto mantiene los valores crudos intactos para que el perfil te muestre el desorden real, y luego decides los tipos de forma deliberada, regla por regla, después de mirar.
¿Hay algún caso en que no valga la pena usar el skill?
Sí, un archivo desechable de cinco filas que nunca vas a volver a ver. Analizar, narrar cada descarte y escribir un script al que le puedas hacer commit cuesta más turnos al inicio, y para datos genuinamente de una sola vez eso es exagerado; límpialo a mano. El skill vale la pena con datos que se repiten o sobre los que alguien va a tomar una decisión. Si no es recurrente ni carga peso, sáltatelo.
¿Qué debe hacer el skill cuando una regla botaría muchas filas?
Detenerse y preguntar, no adivinar. El default es frenar si una sola regla elimina más de un 5%, pero ajusta el umbral por proyecto: una tabla scrapeada ruidosa tolera más, un export financiero no tolera nada. Mejor aún, para datos importantes, manda las filas descartadas a un archivo de cuarentena en vez de borrarlas, así la decisión sigue siendo reversible.
¿Prefieres que lo hagamos por ti?
Esto mismo lo construimos para negocios como el tuyo. La primera conversación es gratis y sin compromiso.
Escríbenos por WhatsAppPrimera conversación gratis. Te responde el fundador.
Recursos relacionados

El skill de revisión de código: un revisor que lee el diff, no el repo
Un revisor empaquetado de Claude Code que invocas antes de cada commit en lugar de repegar las mismas instrucciones. Lee el diff en stage, primero marca los bugs reales de corrección, luego lista aparte las limpiezas opcionales y no opina sobre detalles de estilo que el linter ya cubre. Aquí te explico cómo armarlo, conectarlo y evitar que te reescriba la función completa.

Release Cutter: un skill de Claude Code que lee git en vez de adivinar
Cortar un release de memoria tres días después significa que el changelog nunca cuadra con lo que salió y el salto de versión es una moneda al aire. Este es un skill de Claude Code empaquetado que lee tus commits, propone el salto de semver, escribe un changelog a partir de los títulos reales de los commits, crea el tag y deja listo el release en GitHub. Te muestra la propuesta y espera un sí antes de escribir nada, así un major equivocado nunca sale por accidente.

Skill de auditoría de seguridad: una revisión repetible de tu código antes de que se te complique
Un skill de auditoría de seguridad le da siempre la misma revisión aburrida y estructurada a tu código (secretos filtrados, authz que falta, inyección, cripto débil) y te devuelve una lista priorizada con archivo:línea y una etiqueta de confianza. Aquí te explico cómo armar uno que de verdad ayude en vez de ahogarte en hallazgos de «quizás deberías revisar esto».