Pide a la IA reglas para limpiar un CSV y revisa cada celda modificada
Usa un asistente de chat con IA para proponer reglas explícitas de limpieza de datos, aplica solo las reglas aprobadas a una copia del CSV y genera un registro antes/después por celda. El ejemplo es sintético para que puedas revisar cada transformación manualmente.
Contenido revisado 2026.09.21Incluye archivos de ejemplo
Ver el índice
La traducción se ha realizado con IA. Comprueba el código, las unidades y los valores junto con el original. La revisión por hablantes nativos de cada idioma aún no se ha completado. English
Para quién esPara quienes quieren usar IA para definir reglas repetibles de limpieza de CSV sin permitir que la IA reescriba los datos de forma silenciosa.
Preparación
Python 3.12
Un editor de texto y un asistente de chat con IA
01Empieza con un CSV sintético pequeño
Este ejemplo usa personas y direcciones de correo sintéticas; ninguno de los registros es real. El objetivo no es pedir a la IA que limpie directamente el archivo. En su lugar, pídele que describa reglas que puedas revisar, aprobar y aplicar de forma determinista.
Guarda el siguiente contenido como sample_people.csv. Observa los espacios inconsistentes, las diferencias de mayúsculas y minúsculas en email y department, el marcador de valor ausente y el formato numérico.
text
row_id,name,email,department,hours
1, alice kim ,ALICE.KIM@example.com, sales ,8
2,Bob Lee,bob.lee@example.com,Engineering,7.5
3,Carol Park, carol.park@example.com ,SALES, 8.0
4,Dan Choi,,engineering,NA
5,Eve Han,eve.han@example.com, Sales,9
02Pide reglas a la IA, no un archivo reescrito
Explica a la IA el significado de las columnas y proporciona algunos valores representativos. Pídele que separe los cambios de formato seguros de las transformaciones que podrían alterar el significado.
No apruebes una regla solo porque parezca razonable. Por ejemplo, convertir todos los nombres a Title Case podría modificar una capitalización válida. Del mismo modo, sustituir todos los valores vacíos de hours por cero añadiría información que no existía en la fuente.
03Convierte la respuesta de la IA en una tabla de reglas explícitas
Una respuesta conservadora de la IA para este ejemplo podría sugerir reglas como las siguientes. Revísalas antes de escribir el código.
Columna
Regla aprobada
Motivo
name
Eliminar solo los espacios iniciales y finales
Elimina espacios accidentales sin cambiar las mayúsculas y minúsculas
email
Eliminar espacios y después pasar a minúsculas los valores no vacíos
Normaliza las direcciones del ejemplo sin inventar valores ausentes
department
Tras eliminar espacios, convertir sales en Sales y engineering en Engineering sin distinguir mayúsculas y minúsculas
Usa una lista cerrada visible en el ejemplo
hours
Eliminar espacios; convertir NA en vacío; normalizar la notación decimal válida
Hace coherentes el marcador de ausencia elegido y la representación numérica
row_id
No modificar
Conserva la identidad del registro
Estas reglas son deliberadamente limitadas. Los valores desconocidos de department deben conservarse sin intentar adivinarlos. Los email vacíos siguen vacíos. Tampoco se eliminan filas ni se deduplican registros.
04Predice los cambios antes de ejecutar nada
En un ejemplo pequeño, calcula manualmente el resultado esperado. Así tendrás una referencia con la que revisar después la salida del script.
row_id
Columna
Antes
Después
1
name
alice kim
alice kim
1
email
ALICE.KIM@example.com
alice.kim@example.com
1
department
sales
Sales
3
email
carol.park@example.com
carol.park@example.com
3
department
SALES
Sales
3
hours
8.0
8
4
department
engineering
Engineering
4
hours
NA
5
department
Sales
Sales
Por tanto, deberían cambiar exactamente 9 celdas. La row 2 debe quedar sin cambios y el script debe conservar las 5 filas en su orden original.
05Aplica solo las reglas aprobadas a una copia
El siguiente script, basado únicamente en la biblioteca estándar, valida las columnas esperadas, limpia cada fila y registra todas las celdas cuyo valor cambia. Se detiene si outputs ya existe, lo que reduce el riesgo de sustituir silenciosamente una revisión anterior.
python
import csv
import sys
from decimal import Decimal, InvalidOperation
from pathlib import Path
INPUT = Path("sample_people.csv")
OUTPUT_DIR = Path("outputs")
CLEANED = OUTPUT_DIR / "sample_people_cleaned.csv"
CHANGES = OUTPUT_DIR / "changes.csv"
EXPECTED_FIELDS = ["row_id", "name", "email", "department", "hours"]
DEPARTMENT_MAP = {
"sales": "Sales",
"engineering": "Engineering",
}
def clean_hours(value):
trimmed = value.strip()
if trimmed == "NA":
return "", "NA converted to blank"
if trimmed == "":
return "", "trim whitespace"
try:
number = Decimal(trimmed)
except InvalidOperation:
return trimmed, "trim whitespace"
if number == number.to_integral():
normalized = str(number.quantize(Decimal("1")))
else:
normalized = format(number.normalize(), "f")
return normalized, "normalize numeric notation"
def clean_cell(column, value):
if column == "row_id":
return value, "preserve row_id"
if column == "name":
return value.strip(), "trim name whitespace"
if column == "email":
trimmed = value.strip()
return trimmed.lower() if trimmed else "", "trim and lowercase email"
if column == "department":
trimmed = value.strip()
normalized = DEPARTMENT_MAP.get(trimmed.lower(), trimmed)
return normalized, "trim and normalize known department"
if column == "hours":
return clean_hours(value)
return value, "no rule"
def main():
if not INPUT.is_file():
sys.exit(f"Input file not found: {INPUT}")
if OUTPUT_DIR.exists():
sys.exit(f"Stop: {OUTPUT_DIR} already exists. Review or rename it first.")
OUTPUT_DIR.mkdir()
cleaned_rows = []
changes = []
with INPUT.open("r", encoding="utf-8", newline="") as source:
reader = csv.DictReader(source)
if reader.fieldnames != EXPECTED_FIELDS:
sys.exit(
f"Unexpected columns. Expected {EXPECTED_FIELDS}, got {reader.fieldnames}"
)
for row in reader:
cleaned = {}
for column in EXPECTED_FIELDS:
before = row[column]
after, rule = clean_cell(column, before)
cleaned[column] = after
if before != after:
changes.append(
{
"row_id": row["row_id"],
"column": column,
"before": before,
"after": after,
"rule": rule,
}
)
cleaned_rows.append(cleaned)
with CLEANED.open("x", encoding="utf-8", newline="") as target:
writer = csv.DictWriter(target, fieldnames=EXPECTED_FIELDS)
writer.writeheader()
writer.writerows(cleaned_rows)
with CHANGES.open("x", encoding="utf-8", newline="") as target:
writer = csv.DictWriter(
target,
fieldnames=["row_id", "column", "before", "after", "rule"],
)
writer.writeheader()
writer.writerows(changes)
print(f"Rows written: {len(cleaned_rows)}")
print(f"Changed cells: {len(changes)}")
print(f"Cleaned copy: {CLEANED}")
print(f"Change log: {CHANGES}")
if __name__ == "__main__":
main()
Coloca clean_csv.py y sample_people.csv en la misma carpeta y ejecuta python clean_csv.py. Para este ejemplo, el resumen esperado es 5 rows written y 9 changed cells.
06Revisa cada celda modificada
Abre outputs/changes.csv antes de considerar utilizable el archivo limpio. Cada fila debe explicar una transformación mediante row_id, columna, valor original, valor nuevo y la regla que produjo el cambio.
Confirma que el registro de cambios contenga exactamente 9 filas en este ejemplo sintético.
Comprueba que los valores de row_id nunca aparezcan como celdas modificadas.
Compara las 9 entradas con la tabla calculada manualmente arriba.
Confirma que row 2 no aparezca en el registro de cambios.
Abre outputs/sample_people_cleaned.csv y comprueba que siga teniendo 5 filas de datos en el orden original.
Investiga cualquier cambio adicional en lugar de asumir que la regla propuesta por la IA era correcta.
07Errores comunes y límites
No pidas a la IA que infiera valores faltantes de hours, department o email salvo que tengas un método independiente y justificado para hacerlo.
Evita transformaciones de texto amplias, como convertir todos los nombres a Title Case, sin comprobar si modificarían valores legítimos.
No elimines duplicados solo porque dos filas parezcan similares. La deduplicación requiere una regla explícita de coincidencia de registros.
No sobrescribas el CSV original. Conserva tanto la entrada intacta como la salida revisada.
No revises solo un total como 9 changes. Comprueba qué celdas cambiaron y por qué.
Con conjuntos de datos grandes o sensibles, prueba primero las reglas sobre una muestra representativa y añade validaciones específicas del dominio antes de aplicarlas de forma general.
Aquí la IA es útil como asistente para redactar reglas, no como autoridad final sobre el significado de los datos. Las definiciones de columnas, las categorías válidas, las convenciones de valores ausentes y las transformaciones aceptables deben proceder del propietario del conjunto de datos o de otra fuente autorizada.
Registro de ejecución y verificación
2026-09-21 · hand-checked example · Python 3.12
Revisé manualmente el CSV sintético y las transformaciones aprobadas.
El diff esperado por celda contiene 9 cambios: 3 en row 1, 3 en row 3, 2 en row 4 y 1 en row 5.
row 2 no tiene cambios esperados.
El conjunto limpio esperado conserva las 5 filas, su orden y los valores de row_id.
El script solo escribe en outputs/sample_people_cleaned.csv y outputs/changes.csv y no sobrescribe sample_people.csv.
El script se detiene si la carpeta outputs ya existe.
Límites de la verificación
No ejecuté el código Python; el ejemplo pequeño y los resultados esperados se comprobaron manualmente.
El mapeo de department está limitado deliberadamente a Sales y Engineering y no es un sistema general de normalización de departamentos.
La conversión de direcciones de email a minúsculas se usa como regla explícita de este tutorial; antes de aplicarla de forma amplia deben comprobarse las políticas reales de datos de la organización.
El ejemplo no cubre CSV mal formados, codificaciones inusuales, campos multilínea, cambios de esquema, resolución de registros duplicados ni reglas de validez específicas de un dominio.
Las explicaciones y los ejemplos son de elaboración propia. Puedes consultar los comportamientos y conceptos relacionados en las siguientes fuentes oficiales.
Convierte “automatiza esto” en una descripción de tarea ejecutable. Adjunta una muestra sintética sin datos sensibles y un resultado esperado comprobado manualmente para completar una solicitud de script que totalice registros de trabajo por equipo.
Comprueba una función de agregación con cuatro filas que puedes calcular manualmente y 12 unit tests. Verifica no solo valores normales, sino también entrada vacía, cero, decimales y entrada no válida.
Divide un resumen plausible en hechos, cálculos e interpretaciones. Recalcula proporciones y promedios a partir de datos mensuales sintéticos y reescribe las frases con fuentes faltantes o causas exageradas para convertirlas en afirmaciones comprobables.
Trata una expresión regular generada por IA como un borrador, no como una regla terminada. Crea una pequeña tabla de pruebas sintéticas, compara las coincidencias esperadas con las reales, corrige el patrón y guarda un informe de revisión antes de usarlo con datos reales.