1. Faro

Nivel 9 · Convierte una exportación de precios desordenada en números

La solicitud

De Thomas Whitaker, Director de Merchandising

“Nuestro nuevo proveedor nos envió su lista de precios como una exportación de hoja de cálculo y es un desastre: signos de dólar, comas, líneas en blanco, 'n/a', 'TBD'. Necesito los precios como números reales para poder compararlos con los nuestros. Deja un hueco donde no haya un precio real.”

Tu objetivo

Usando supplier (dado), elimina las filas donde todas las columnas están vacías con dropna(how='all'), conservando las filas que solo tienen sku. Limpia price en una columna float price_usd: quita espacios, elimina '$' y ',', y luego convierte con pd.to_numeric(errors='coerce') para que texto como 'n/a' pase a NaN. Asigna a result un DataFrame con las columnas sku y price_usd, en el orden original de las filas, con el índice reiniciado.

  • Muestra exactamente sku price_usdpendiente
  • 9 filas, ordenadas como se pidependiente

Tu código

Python

Cargando el editor…

    ResultadoPresiona Ejecutar para ver el tuyo

    Mote revisa tu resultado

    Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

    La lección

    Filas en blanco: dropna(how=“all”)

    Las exportaciones de hojas de cálculo suelen traer líneas vacías entre bloques. En las listas de Python normales que construyen supplier, esas celdas son None; una vez en un DataFrame, pandas las trata como ausentes, igual que NaN. dropna elimina las filas con valores ausentes, pero por defecto elimina una fila si falta algún valor:

    len(supplier)                   # 11
    len(supplier.dropna())          # 8, HP-111 is gone too
    len(supplier.dropna(how="all")) # 9, only the fully blank rows go

    HP-111 tiene sku pero todavía no tiene precio. Esa es información que Thomas quiere ver (“aún sin precio”), así que how="all" es la opción correcta: eliminar una fila solo cuando todas las columnas están vacías. subset=["sku"] es la otra opción habitual, que elimina las filas que no tienen sku sea lo que sea que contengan.

    De texto a números

    pd.to_numeric(supplier["price"]) falla de inmediato con ValueError: Unable to parse string "$1,299.00". Limpia primero el texto para que solo queden dígitos y un punto decimal:

    text = (
        clean["price"].str.strip()
        .str.replace("$", "", regex=False)
        .str.replace(",", "", regex=False)
    )

    regex=False dice “reemplaza exactamente este carácter”. En los patrones, $ tiene un significado especial, así que ser explícito evita sorpresas. Después de esto, “$1,299.00” es “1299.00” y ” 45 ” es “45”, pero “n/a” y “TBD” siguen siendo palabras.

    errors="coerce" le dice a to_numeric que convierta en NaN todo lo que no pueda leer en lugar de detenerse:

    clean["price_usd"] = pd.to_numeric(text, errors="coerce")
    clean["price_usd"].isna().sum()   # 3: n/a, TBD and HP-111's missing price

    Forzar es una decisión, no una solución: los valores incorrectos se convierten en huecos. Cuenta siempre los NaN que creó y mira qué eran, para que una errata como “12,99” (una coma decimal) no se convierta en silencio en 1299.

    La lista limpia

    Quedan nueve productos, seis con un precio real, desde $12.99 (HP-108) hasta $1,299.00 (HP-101). Los tres huecos le dicen a Thomas exactamente a qué skus tiene que perseguir al proveedor. Como price_usd es ahora una columna float real, puede ordenarla, promediarla o compararla con products["unit_price"], nada de lo cual funciona con el texto original. Conserva la columna price en bruto a su lado mientras compruebas el resultado, y luego elimínala de la versión que compartas.

    Errores comunes

    • dropna() sin how="all", que elimina también los productos a los que solo les falta el precio.
    • astype(float) sobre el texto en bruto, que lanza un ValueError con “$1,299.00”.
    • Olvidar quitar la coma, de modo que “1,050” se convierte en NaN en lugar de 1050.
    • Forzar sin contar los NaN después.

    Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.