La solicitud

De Daniel Brooks, Director de Operaciones
Tu objetivo
Asigna a result una Series con el shipping_fee medio por canal, redondeado a 2 decimales, tal como lo devuelve orders.groupby("channel")["shipping_fee"].mean(): índice = canal (ordenado de la A a la Z), valores con el nombre shipping_fee.
- Usa el DataFrame
orderspendiente - Muestra exactamente
channelshipping_feependiente - 3 filas, ordenadas como se pidependiente
Tu código
Cargando el editor…
Solución de referencia
| order_id | customer_id | order_date | status | channel |
|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Daniel, y por qué
DataFrames
Cargados como DataFrames de pandas, junto con pd y np.
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 |
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 |
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 |
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
Dividir, aplicar, combinar
groupby hace tres cosas en una llamada:
- Divide las filas en grupos que comparten un valor (un grupo por canal).
- Aplica un cálculo a cada grupo (el costo de envío medio).
- Combina las respuestas en una Series o DataFrame nuevo, una fila por grupo.
orders.groupby("channel")["shipping_fee"].mean()
channel
app ...
marketplace ...
web ...
Name: shipping_fee, dtype: float64
Léelo de izquierda a derecha: agrupa los pedidos por canal, toma la columna shipping_fee y promédiala. Las claves del grupo se convierten en el índice del resultado, ordenado de la A a la Z por defecto.
Agregaciones comunes
| método | por grupo |
|---|---|
.sum() |
total |
.mean() / .median() |
promedio / valor central |
.min() / .max() |
extremos |
.count() |
valores que no faltan en la columna |
.size() |
filas, falten valores o no |
.nunique() |
valores distintos |
count y size se parecen pero responden a preguntas distintas:
orders.groupby("channel")["coupon_code"].count() # orders WITH a coupon, per channel
orders.groupby("channel").size() # all orders, per channel
count omite los valores que faltan, así que es un conteo de cupones usados. size cuenta filas.
Confundirlos produce números que parecen plausibles y son erróneos, que es lo peor.
¿Series o DataFrame?
Seleccionar una columna después de groupby da una Series indexada por el grupo. Para obtener una tabla
normal de dos columnas, que suele ser lo que quieres para mostrar, unir o exportar, usa reset_index() o
as_index=False:
orders.groupby("channel")["shipping_fee"].mean().reset_index()
orders.groupby("channel", as_index=False)["shipping_fee"].mean()
Ambas dan un DataFrame con las columnas channel y shipping_fee.
Leer el resultado
El costo de envío medio por canal mezcla pedidos con envío gratis (costo 0) con pedidos de pago. Es una respuesta justa a «¿cuánto aporta el envío por pedido?», pero no a «¿qué paga la gente cuando paga?». Para la segunda pregunta, filtra primero:
paid = orders[orders["shipping_fee"] > 0]
paid.groupby("channel")["shipping_fee"].mean()
El mismo código, filas distintas, significado distinto. Pregúntate siempre sobre qué población trata la pregunta antes de agrupar.
Ordenar la salida
El resultado está ordenado por la clave del grupo. Para ordenar los grupos por el valor, ordena después:
.sort_values(ascending=False).
Errores comunes
- Olvidar elegir una columna:
orders.groupby("channel").mean()intenta promediar todas las columnas y falla con las de texto en pandas 2. Elige lo que necesitas, o pasanumeric_only=True. - Usar
count()cuando quieres decir «número de filas». - Comparar promedios sin los tamaños de grupo. Un canal con pocos pedidos puede tener una media extrema
por azar; muestra
size()al lado.
¡Linterna encendida!
Practicaste: groupbymeansizecountsplit apply combine
- Resuelto
- Sin pistas
- Al primer intento
