La solicitud

De Thomas Whitaker, Director de Merchandising
Tu objetivo
Convierte tags_export['tags'] en listas reales (una celda ausente cuenta como sin etiquetas), da a cada producto y etiqueta su propia fila, y añade la cantidad de cada línea de order_items de ese producto (todas las líneas de pedido, tal como están). Asigna a result un DataFrame con las columnas tag y units (cantidad total por etiqueta), una fila por etiqueta, ordenado por units descendente y luego por tag ascendente, con el índice reiniciado. Los productos sin etiquetas se dejan fuera.
- Usa el DataFrame
order_itemspendiente - Muestra exactamente
tagunitspendiente - 4 filas, ordenadas como se pidependiente
Tu código
Cargando el editor…
Solución de referencia
| order_item_id | order_id | product_id | quantity | unit_price |
|---|---|---|---|---|
| 1 | 1001 | 121 | 9 | 31.99 |
| 2 | 1001 | 154 | 3 | 11.99 |
| 3 | 1002 | 154 | 4 | 11.99 |
| 4 | 1002 | 194 | 1 | 149.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.
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 |
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 |
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 |
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
Listas dentro de celdas
A veces una celda contiene varios valores: las etiquetas de un producto, las habilidades requeridas
de un puesto, las respuestas a una pregunta de “marca todo lo que corresponda”. Guardado en un
DataFrame, eso es una columna cuyas celdas son listas. No puedes agrupar ni contar por ella
directamente, porque groupby necesita un valor por fila.
explode lo arregla. Da a cada elemento de la lista su propia fila y repite las demás columnas:
df = pd.DataFrame({"product_id": [101, 113], "tags": [["statement", "bestseller"], ["bestseller"]]})
df.explode("tags")
# product_id tags
# 0 101 statement
# 0 101 bestseller
# 1 113 bestseller
Las etiquetas del índice se repiten (0, 0, 1), lo que te dice qué filas vinieron de la misma fila
original. Añade .reset_index(drop=True) si quieres un 0, 1, 2 limpio. Una lista vacía se convierte
en una fila con NaN, y una celda ausente sigue ausente.
Cuando las listas llegan como texto
Los archivos no pueden guardar listas de Python. Un CSV o una exportación de base de datos las
escribe como texto, así que tras cargar, la celda es la cadena "['statement', 'bestseller']", con
los corchetes y las comillas incluidos. explode trata una cadena como un valor único y la deja como está.
ast.literal_eval (del módulo integrado ast de Python) lee ese texto y recupera el objeto real.
Solo acepta literales: listas, dicts, tuplas, números, cadenas, True, False y None. A diferencia de
eval, nunca ejecuta código, así que es seguro con datos de un archivo.
import ast
ast.literal_eval("['gift-idea', 'small-space']") # ['gift-idea', 'small-space'], a list
Aplícalo a la columna, protegiéndote de las celdas ausentes, que no son cadenas:
col.apply(lambda x: ast.literal_eval(x) if isinstance(x, str) else [])
Un ejemplo trabajado: contar etiquetas
Tras convertir y aplicar explode a la exportación de ocho productos, hay 12 filas: una por producto
y etiqueta, más una fila NaN para el producto con una lista vacía y otra para el producto con una
celda ausente. Contar etiquetas es entonces un value_counts normal:
exploded["tags"].value_counts()
# gift-idea 4
# bestseller 3
# statement 2
# small-space 1
Unir las filas expandidas con order_items por product_id trae todas las líneas de pedido de cada
producto, una vez por etiqueta. Un producto con dos etiquetas tiene sus unidades contadas bajo
ambas, así que los totales por etiqueta suman más que los productos vendidos. Eso es correcto para
“unidades vendidas bajo cada etiqueta”, pero dilo cuando lo informes.
Errores comunes
- Aplicar explode a una columna de texto. La cadena no es una lista, así que
explodeno cambia nada. - Llamar a
ast.literal_evalsobre una celda ausente, lo que lanza un error. Compruebaisinstance(x, str). - Usar
evalen lugar deast.literal_evalcon datos de un archivo.evalejecuta cualquier código que contenga el texto. - Sumar los totales por etiqueta como si fueran un total general: los productos con varias etiquetas se cuentan más de una vez.
¡Linterna encendida!
Practicaste: explodeast literal evallist columnapplymergegroupby
- Resuelto
- Sin pistas
- Al primer intento
