La solicitud

De Jordan Reyes, Director de Marketing
Tu objetivo
Asigna a result un DataFrame de productos con categoría 'Lighting' y unit_price entre 50 y 200 inclusive, con las columnas name y unit_price, ordenados por unit_price ascendente y luego name ascendente, con el índice reiniciado.
- Usa el DataFrame
productspendiente - Muestra exactamente
nameunit_pricependiente - 10 filas, ordenadas como se pidependiente
Tu código
Cargando el editor…
Solución de referencia
| product_id | name | category | subcategory | unit_price |
|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Jordan, y por qué
DataFrames
Cargados como DataFrames de pandas, junto con pd y np.
products120 filas · 8 columnas
product_idintegernamevarcharcategoryvarcharsubcategoryvarcharunit_pricedecimalunit_costdecimallaunched_ondateis_activeboolean
| product_id | name | category | subcategory | unit_price | unit_cost | launched_on | is_active |
|---|---|---|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 | NaN | 2023-09-11 | true |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 | 503.50 | 2024-05-16 | true |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 | 429.87 | 2023-05-27 | true |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 | 214.70 | 2022-12-20 | true |
| 105 | Avery Leather Bed Frame | Furniture | Beds | 449.00 | 232.70 | 2021-08-31 | true |
customers2,018 filas · 9 columnas
customer_idintegerfirst_namevarcharlast_namevarcharemailvarcharcityvarcharstatevarcharsignup_datedatesegmentvarcharreferral_sourcevarchar
| customer_id | first_name | last_name | city | state | signup_date | segment | referral_source | |
|---|---|---|---|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco | CA | 2022-06-02 | consumer | search |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta | GA | 2022-06-02 | consumer | NaN |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles | CA | 2022-06-04 | business | NaN |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle | WA | 2022-06-06 | business | |
| 5 | Kyle | Jimenez | kjimenez27@yahoo.com | Indianapolis | IN | 2022-06-07 | consumer | NaN |
orders12,000 filas · 7 columnas
order_idintegercustomer_idintegerorder_datetimestampstatusvarcharchannelvarcharshipping_feedecimalcoupon_codevarchar
| order_id | customer_id | order_date | status | channel | shipping_fee | coupon_code |
|---|---|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web | 0.00 | NaN |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web | 0.00 | NaN |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace | 4.99 | WELCOME10 |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace | 4.99 | WELCOME10 |
| 1005 | 82 | 2023-01-02 11:43:36 | completed | web | 0.00 | WELCOME10 |
order_items30,338 filas · 6 columnas
order_item_idintegerorder_idintegerproduct_idintegerquantityintegerunit_pricedecimaldiscount_pctdecimal
| order_item_id | order_id | product_id | quantity | unit_price | discount_pct |
|---|---|---|---|---|---|
| 1 | 1001 | 121 | 9 | 31.99 | 0.00 |
| 2 | 1001 | 154 | 3 | 11.99 | 0.00 |
| 3 | 1002 | 154 | 4 | 11.99 | 0.00 |
| 4 | 1002 | 194 | 1 | 149.00 | 0.00 |
| 5 | 1002 | 193 | 2 | 19.99 | 0.00 |
returns1,673 filas · 5 columnas
return_idintegerorder_item_idintegerreturned_ondatereasonvarcharrefund_amountdecimal
| return_id | order_item_id | returned_on | reason | refund_amount |
|---|---|---|---|---|
| 1 | 14 | 2023-01-10 | damaged | 83.69 |
| 2 | 42 | 2023-01-10 | wrong_item | 19.99 |
| 3 | 105 | 2023-01-14 | wrong_item | 10.99 |
| 4 | 24 | 2023-01-16 | changed_mind | 26.99 |
| 5 | 126 | 2023-01-16 | late | 20.99 |
employees60 filas · 8 columnas
employee_idintegerfirst_namevarcharlast_namevarchardepartmentvarchartitlevarcharmanager_idintegerhire_datedatesalaryinteger
| employee_id | first_name | last_name | department | title | manager_id | hire_date | salary |
|---|---|---|---|---|---|---|---|
| 1 | Catherine | Hale | Executive | Chief Executive Officer | NaN | 2016-03-01 | 285000 |
| 2 | Robert | Kim | Executive | Chief Operating Officer | 1 | 2017-01-09 | 235000 |
| 3 | Megan | Collins | Sales | Head of Sales | 1 | 2018-04-16 | 172000 |
| 4 | Chloe | Gutierrez | Sales | Account Executive | 3 | 2020-01-21 | 72000 |
| 5 | Frank | Bell | Sales | Account Executive | 3 | 2023-05-21 | 73000 |
web_sessions40,000 filas · 7 columnas
session_idintegercustomer_idintegerstarted_attimestampdevicevarcharsourcevarcharpages_viewedintegerconvertedboolean
| session_id | customer_id | started_at | device | source | pages_viewed | converted |
|---|---|---|---|---|---|---|
| 1 | NaN | 2023-01-01 23:02:24 | mobile | paid | 1 | false |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid | 1 | false |
| 3 | NaN | 2023-01-01 16:55:46 | desktop | direct | 7 | false |
| 4 | NaN | 2023-01-01 12:43:28 | mobile | organic | 3 | false |
| 5 | NaN | 2023-01-01 13:06:21 | mobile | social | 2 | false |
marketing_spend3,276 filas · 3 columnas
spend_datedatechannelvarcharamountdecimal
| spend_date | channel | amount |
|---|---|---|
| 2023-01-01 | paid | 492.99 |
| 2023-01-01 | 37.38 | |
| 2023-01-01 | social | 200.53 |
| 2023-01-02 | paid | 709.13 |
| 2023-01-02 | 64.13 |
La lección
Rangos con between
«De $50 a $200» es un rango. Podrías escribir dos comparaciones:
(products["unit_price"] >= 50) & (products["unit_price"] <= 200)
between dice lo mismo con más claridad:
products["unit_price"].between(50, 200)
Por defecto ambos extremos se incluyen, como suele hablar la gente de los rangos. Cámbialo con
inclusive="left", "right" o "neither" cuando el encargo diga «menos de $200» o «más de $50».
Comprueba siempre cuál es el que quiere decir el encargo. El catálogo de Harbor & Pine tiene productos a
exactamente $189 y $159, y en los catálogos reales encontrarás casos límite como un producto de $200 todo
el tiempo.
between también funciona con fechas, que usarás constantemente:
orders[orders["order_date"].between("2025-11-01", "2025-11-30 23:59:59")]
Filtrar por texto
Las columnas de texto tienen un accesor .str con métodos de string vectorizados que devuelven máscaras:
products["name"].str.contains("Lamp") # name includes 'Lamp'
products["name"].str.contains("lamp", case=False) # ignore case
products["name"].str.startswith("Oak")
products["subcategory"].isin(["Pendants", "Chandeliers"])
Así que «todos los productos con Brass en el nombre» es
products[products["name"].str.contains("Brass")].
Dos precauciones con str.contains:
- Trata el patrón como una expresión regular por defecto, así que caracteres como
(,.y+tienen significados especiales. Pasaregex=Falsepara coincidir con el texto literalmente. - En una columna con valores que faltan, devuelve NaN para esas filas, y usar eso como máscara falla. Pasa
na=Falsepara tratar el texto que falta como «no contiene».
Construir la respuesta
mask = (products["category"] == "Lighting") & products["unit_price"].between(50, 200)
(
products.loc[mask, ["name", "unit_price"]]
.sort_values(["unit_price", "name"])
.reset_index(drop=True)
)
sort_values con una lista ordena ascendente por cada columna por defecto, que es lo que quiere este
encargo.
El precio es una instantánea
products.unit_price es el precio de lista actual. Algunos productos subieron de precio en marzo de
2025, así que las líneas de pedido más antiguas de order_items muestran un precio pagado más bajo. Para
una lista de campaña, el precio actual es el correcto. Para los ingresos, usa siempre el precio de la
línea del pedido. Elegir la columna adecuada para la pregunta es parte del trabajo.
Comprueba los bordes
Después de filtrar un rango, mira los valores más pequeño y más grande que pasaron:
result["unit_price"].agg(["min", "max"]). Si el encargo dice de $50 a $200 y el mínimo es $54.99,
comprueba si existe un producto a exactamente $50 que se excluyó por error. Comprobaciones de borde como
esta llevan segundos y detectan los errores de inclusivo/exclusivo que a los revisores les encanta
encontrar.
Errores comunes
- Usar
betweencuando el encargo dice «menos de» e incluir el límite superior. - Olvidar
na=Falseenstr.containspara una columna con huecos. - Buscar con las mayúsculas equivocadas:
str.contains("lamp")no encuentra “Floor Lamp”.
¡Linterna encendida!
Practicaste: betweenstr containsfilteringsorting
- Resuelto
- Sin pistas
- Al primer intento
