La solicitud

De Jordan Reyes, Director de Marketing
Tu objetivo
Asigna a result un DataFrame de clientes cuyo segment es 'consumer', cuyo referral_source es 'instagram', 'tiktok' o 'pinterest', y cuyo email termina con '@icloud.com'. Columnas customer_id, email, referral_source, signup_date (en ese orden), ordenadas por signup_date ascendente y luego customer_id ascendente, índice reiniciado.
- Usa el DataFrame
customerspendiente - Muestra exactamente
customer_idemailreferral_sourcesignup_datependiente - 50 filas, ordenadas como se pidependiente
Tu código
Cargando el editor…
Solución de referencia
| customer_id | first_name | last_name | city | |
|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle |
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.
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 |
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
Una máscara por regla
El ticket de Jordan tiene tres reglas, y cada una se convierte en una máscara. Ponerles nombre mantiene corto el filtro final y deja claro qué hace cada regla:
is_consumer = customers["segment"] == "consumer"
from_social = customers["referral_source"].isin(["instagram", "tiktok", "pinterest"])
on_icloud = customers["email"].str.endswith("@icloud.com")
audience = customers[is_consumer & from_social & on_icloud]
isin es la forma limpia de decir «es uno de estos valores». La alternativa son tres pruebas de igualdad
unidas con |, dentro de sus propios paréntesis, que es más larga y fácil de agrupar mal.
str.endswith comprueba cómo termina un trozo de texto. Es la herramienta adecuada para un dominio de
correo: "@icloud.com" debe ser el final exacto de la dirección. str.contains("icloud") también
coincidiría con una dirección de Gmail que casualmente incluya “icloud” en la parte del nombre.
¿Y los valores que faltan?
referral_source falta (NaN) para 666 clientes. isin simplemente devuelve False para ellos, así que
quedan fuera, que es lo que queremos: una fuente desconocida no es una referencia de redes sociales.
str.endswith devolvería NaN para un correo que falta, pero todos los clientes tienen uno, así que la
máscara está limpia aquí. En una columna con huecos añadirías na=False, igual que con str.contains.
Ordenar con un desempate
Varios clientes pueden darse de alta el mismo día, así que ordenar solo por signup_date podría
listarlos en cualquier orden. Añadir customer_id como segunda clave de ordenación hace el orden
totalmente predecible:
audience.sort_values(["signup_date", "customer_id"])
La lista tiene 50 clientes. El alta más antigua es el cliente 67 (2022-08-26, vía TikTok), y la más nueva es el cliente 1999, que se dio de alta el 2025-12-31. Instagram aporta la mitad de ellos (25), TikTok 15 y Pinterest 10, lo que coincide con que Instagram sea la mayor fuente social en toda la tabla (218 clientes).
Errores comunes
- Escribir
customers["referral_source"] == "instagram" | "tiktok", que falla. Usaisin. - Usar
str.contains("icloud")cuando la regla trata de cómo termina la dirección. - Unir máscaras con
anden lugar de&. - Ordenar solo por
signup_date, de modo que los clientes que se dieron de alta el mismo día pueden salir en un orden distinto al pedido.
¡Linterna encendida!
Practicaste: boolean maskisinstr endswithand or notsort values
- Resuelto
- Sin pistas
- Al primer intento
