La solicitud

De Thomas Whitaker, Director de Merchandising
Tu objetivo
Asigna a result un DataFrame con una fila por categoría y las columnas category, n_products (número de productos), avg_price (media de unit_price, redondeada a 2) y max_price (máximo de unit_price), ordenado por category de la A a la Z, con category como columna normal (no como índice).
- Usa el DataFrame
productspendiente - Muestra exactamente
categoryn_productsavg_pricemax_pricependiente - 6 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 Thomas, 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
Varios números por grupo
Una tabla resumen normalmente necesita más de una estadística. agg calcula varias a la vez. La forma más
clara es la agregación con nombre: cada palabra clave es el nombre de una columna de salida, y su valor
es una pareja (column, function).
products.groupby("category").agg(
n_products=("product_id", "count"),
avg_price=("unit_price", "mean"),
max_price=("unit_price", "max"),
)
Decides los nombres de columna desde el principio, así que no hay que renombrar después ni encabezados confusos de varios niveles. Este es el estilo que debes usar en el código compartido.
La función puede ser un string ("sum", "mean", "median", "min", "max", "count", "size",
"nunique", "first") o cualquier función que reciba una Series y devuelva un valor:
products.groupby("category").agg(
price_range=("unit_price", lambda s: s.max() - s.min()),
)
Mantener la clave como columna
Por defecto las claves del grupo se convierten en el índice. Con as_index=False, siguen siendo una
columna normal, que es lo que quieres para una tabla que vas a ordenar, unir o exportar:
products.groupby("category", as_index=False).agg(...)
Llamar a .reset_index() después de un groupby normal da la misma forma.
Redondear columnas seleccionadas
DataFrame.round acepta un diccionario, así que puedes redondear solo lo que lo necesita:
summary.round({"avg_price": 2})
Redondear toda la tabla con .round(2) también está bien, ya que los conteos son números enteros de todos
modos. Solo evita redondear la columna de precio original antes de promediar, lo que cambiaría el
resultado.
Otros estilos de agregación que verás
El código y los tutoriales más antiguos usan otras formas. Funcionan, pero producen nombres de columna menos predecibles:
products.groupby("category")["unit_price"].agg(["mean", "max"]) # columns: mean, max
products.groupby("category").agg({"unit_price": ["mean", "max"]}) # two-level column headers
La forma de diccionario da un MultiIndex para las columnas (("unit_price", "mean")), que es
incómodo de manejar. La agregación con nombre lo evita.
Contar productos
("product_id", "count") cuenta los ID que no faltan. Como los ID nunca faltan, eso es igual al número de
filas. Para contar productos distintos en una tabla donde se repiten, como las líneas de pedido, usa en su
lugar ("product_id", "nunique"). Elegir entre count, size y nunique es una decisión de
corrección, no de estilo.
Leer el resultado
Cada categoría tiene 20 productos, así que las columnas interesantes son los precios. El promedio de Furniture es mucho más alto que el de Decor; compara el promedio con el máximo para detectar categorías en las que uno o dos artículos premium suben la media.
Errores comunes
- Escribir
n_products=("product_id", count)con el nombre sin comillascount, que no está definido. Usa el string"count"(o la función integradalen). - Olvidar
as_index=False, de modo quecategoryes el índice y no una columna. - Escribir mal la columna dentro de la tupla:
("price", "mean")lanzaKeyError.
¡Linterna encendida!
Practicaste: named aggregationaggas indexmultiple aggregations
- Resuelto
- Sin pistas
- Al primer intento
