La solicitud

De Thomas Whitaker, Director de Merchandising
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
skuprice_usdpendiente - 9 filas, ordenadas como se pidependiente
Tu código
Cargando el editor…
Solución de referencia
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Thomas, y por qué
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()sinhow="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.
¡Linterna encendida!
Practicaste: dropnato numericstr replacestripnandata quality
- Resuelto
- Sin pistas
- Al primer intento
