¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Datos que faltan y datos erróneos

La lección completa está aquí para leer. Crea una cuenta gratuita para ejecutar sus comandos en un laboratorio y hacer sus cuestionarios y tareas.

Lección de 45 minSin comandos

La suma no cuadra

Trabajas en una academia de idiomas de Zaragoza. Tres compañeros apuntan las altas de clientes en la misma hoja.

Quieres sumar las cuotas del mes y Python se para con un error. Una cuota pone "N/D". Otra pone "45,00 €". Otra es negativa.

Antes de analizar nada, hay que limpiar.

Al final de esta lección

Nota

Puedo encontrar y arreglar valores que faltan y valores erróneos.

Palabras clave

PalabraQué significaEjemplo
Valor que faltauna celda vacía o sin dato real"N/D"
Valor erróneoun dato que no puede ser cierto"-45"
Limpiarencontrar y corregir esos valores
Convertirpasar un texto a númerofloat("45.0")
Noneel valor de Python para "no hay dato"

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Primero se buscan los problemas

Los datos reales casi nunca llegan limpios. Alguien deja una celda vacía. Otro escribe "N/D".

También hay valores que existen pero no pueden ser ciertos. Un código postal español tiene cinco cifras. Una cuota no es negativa.

Por eso se recorre la tabla con un bucle y un if por cada regla. Cada fila que falla se apunta, todavía sin tocarla.

Busca las celdas con problemas

Código: python
# Altas de clientes copiadas de un formulario. Algunas celdas vienen mal.
customers = [
    {"name": "Lucía Pérez", "postcode": "50001", "fee": "45,00 €"},
    {"name": "Jorge Gil", "postcode": "", "fee": "45,00 €"},
    {"name": "Ana Ruiz", "postcode": "50012", "fee": "N/D"},
    {"name": "Pablo Sanz", "postcode": "5001", "fee": "-45"},
]

for customer in customers:
    problems = []
    if customer["postcode"] == "":
        problems.append("falta el código postal")
    elif len(customer["postcode"]) != 5:
        problems.append("código postal con cifras de menos")
    if customer["fee"] == "N/D":
        problems.append("falta la cuota")
    print(customer["name"], problems)

# Añade una prueba más: la cuota no puede empezar por "-".

Lo que encuentra el programa

ClienteCeldaProblemaTipo
Jorge Gilpostcode = ""está vacíofalta
Ana Ruizfee = "N/D"no hay cuotafalta
Pablo Sanzpostcode = "5001"solo 4 cifraserróneo
Pablo Sanzfee = "-45"cuota negativaerróneo

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Después se arregla o se marca

Algunos valores se pueden arreglar. "45,00 €" es un buen dato mal escrito. Quitas el símbolo, cambias la coma por un punto y lo conviertes en número.

Otros no se pueden adivinar. Si falta la cuota, no te la inventas. La marcas con None, que en Python significa "no hay dato".

Lo que no sabes arreglar se le pregunta a quien apuntó el dato.

Convierte una cuota en número

Código: python
# Una cuota escrita a la española: coma decimal y símbolo del euro.
text = " 45,00 € "

text = text.strip()           # quita los espacios de los lados
text = text.replace("€", "")  # quita el símbolo
text = text.strip()
text = text.replace(",", ".") # Python usa punto decimal
fee = float(text)

print("Cuota como número:", fee)
print("Cuota con IVA:", fee * 1.21)

# Cambia el texto de arriba por "12,50 €" y vuelve a ejecutar.

Un error frecuente

Advertencia

Mucha gente cree que un valor que falta se arregla poniendo 0. No es así. Un 0 dice que la cuota es gratis, y eso cambia la suma y la media. Usa None cuando no sepas el dato, y así las cuentas pueden saltarlo.

Tu turno: limpiar las cuotas

Contabilidad quiere sumar las cuotas del trimestre. Escribe una función que convierta una cuota escrita como texto en un número. Si no hay dato, devuelve None. Unas pruebas ocultas comprueban tu respuesta.

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.