La solicitud

De Priya Shah, Directora de Datos
Tu objetivo
Normaliza email quitando espacios y pasándolo a minúsculas. Asigna a result el número de filas de clientes (un int) cuyo email normalizado ya apareció en una fila anterior, es decir, las filas que eliminaría una deduplicación.
- Usa el DataFrame
customerspendiente - Guarda un número en
resultpendiente
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 Priya, 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
Los duplicados exactos son la parte fácil
duplicated() marca las filas que repiten una fila anterior:
customers.duplicated().sum() # whole-row duplicates
customers.duplicated(subset=["email"]).sum() # same email, any other columns
Los duplicados de fila completa son raros en datos reales, porque un segundo registro recibe un ID nuevo y una fecha nueva. Lo que necesitas es una clave de negocio: la columna (o columnas) que debería identificar a una persona de forma única. Para los clientes, es el email.
Normaliza primero la clave
Seis de los duplicados de Harbor & Pine comparten el email exactamente. Doce más difieren solo en
mayúsculas o en un espacio inicial, ' owen.hudson@icloud.com' frente a 'owen.hudson@icloud.com'.
Una comparación en bruto los pasa por alto, así que construye una clave normalizada:
email_key = customers["email"].str.strip().str.lower()
email_key.duplicated().sum()
Compáralo con customers["email"].duplicated().sum() para ver cuántos duplicados descubre la
normalización. Esa diferencia es el objetivo de este nivel.
keep: ¿qué copia cuenta como el original?
duplicated acepta keep=:
keep="first"(por defecto): la primera aparición es el original; las posteriores son True.keep="last": la última aparición es el original.keep=False: cada fila de un grupo duplicado es True. Úsalo para mirar todas las copias una al lado de otra.
dupes = customers[email_key.duplicated(keep=False)]
dupes.assign(email_key=email_key).sort_values(["email_key", "customer_id"])
Revisar los grupos a ojo antes de eliminar nada es una buena práctica. Aquí verías el mismo nombre y ciudad, una fecha de registro posterior y un ID mayor en el segundo registro.
drop_duplicates
Para eliminar las repeticiones, conserva una fila por clave. Ordena primero para que la fila que quieres conservar vaya la primera:
deduped = (
customers.assign(email_key=email_key)
.sort_values("customer_id")
.drop_duplicates(subset="email_key", keep="first")
)
Conservar el ID más bajo conserva la cuenta original, que es la que tiene el historial de pedidos. Decide siempre a propósito qué copia sobrevive. “La que viniera primero en el archivo” no es una regla.
Duplicados y joins
Las claves duplicadas causan el fan-out que viste en el capítulo de merge: un pedido emparejado con
dos copias de su cliente se cuenta dos veces. Si unes pedidos con clientes por customer_id, estos
duplicados son inofensivos, porque cada uno tiene su propio ID. Si emparejas por email (por ejemplo,
para unir una lista de newsletter), se cuentan doble. Elimina duplicados antes de unir por una clave de negocio.
No borres, marca
En producción, suele ser mejor añadir una marca (is_duplicate) o un mapeo del ID duplicado al ID
original que eliminar filas. Otras tablas pueden referenciar los IDs duplicados, y finanzas puede
necesitar saber que existieron.
Errores comunes
- Comprobar duplicados en el email en bruto y concluir que solo hay seis.
- Usar
keep=Falsey luego eliminar, lo que borra también los originales. - Eliminar duplicados por todas las columnas, lo que no encuentra nada porque los IDs difieren.
Nota de entrevista
“¿Cómo encontrarías clientes duplicados?” es un clásico. Una buena respuesta nombra la clave de
negocio, la normaliza, inspecciona los grupos con keep=False y explica qué registro sobrevive.
¡Linterna encendida!
Practicaste: duplicateddrop duplicatessubsetkeepnormalisation
- Resuelto
- Sin pistas
- Al primer intento
