Nivel 1 · ¿De dónde vienen los clientes?
¿Es nuevo para ti? Lee primero el concepto: Limpiar es lograr que lo igual sea igual
0 de 3
La solicitud

De Jordan Reyes, Director de Marketing
Tu objetivo
Asigna a result una Series que cuente los clientes por referral_source, con los valores ausentes reemplazados por la cadena 'unknown', tal como la devuelve value_counts() (ordenada de más a menos común).
- Usa el DataFrame
customerspendiente - Muestra exactamente
referral_sourcecountpendiente - 9 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
Qué aspecto tiene un valor ausente
En Python normal un valor ausente es None. Dentro de una columna de pandas aparece como NaN (para
números y texto cargados desde CSV) o NaT (para fechas): una celda vacía en el CSV se convierte en
NaN. En ambos casos, ausente no es cero ni una cadena vacía; significa “no lo sabemos”.
Encontrarlos es el primer paso:
customers.isna().sum()
customer_id 0
...
city 14
...
referral_source 666
isna() devuelve una tabla de True/False, y .sum() cuenta los valores True por columna. notna()
es lo contrario. customers["referral_source"].isna().mean() da la proporción ausente, aquí
alrededor de un tercio.
Ausente es información
Pregunta por qué faltan los valores antes de decidir qué hacer. Aquí, referral_source falta porque
muchos clientes se saltaron la pregunta “¿cómo nos conociste?”. Eso es natural, no un error, y es un
grupo considerable, así que pertenece al informe como una categoría propia.
city falta en 14 filas, probablemente un hueco de entrada de datos. products.unit_cost falta en
9 productos cuyo coste no se registró. Cada caso pide un tratamiento distinto.
fillna: reemplazar por un valor
customers["referral_source"].fillna("unknown")
products["unit_cost"].fillna(products["unit_cost"].median()) # an estimate, use with care
fillna devuelve una Series nueva. Para cambiar el DataFrame, asígnala de nuevo a la columna:
customers["referral_source"] = customers["referral_source"].fillna("unknown"). Evita
fillna(..., inplace=True) sobre una columna seleccionada; es una forma de asignación encadenada
que puede no cambiar el DataFrame original.
Rellena las categorías de texto con una etiqueta explícita como "unknown". Ten mucho más cuidado
con los números. Rellenar costes ausentes con 0 haría que esos productos parecieran 100 % rentables,
y rellenar con una media inventa datos. A menudo la opción honesta es dejar los números ausentes y
excluirlos de ese cálculo concreto, indicándolo en una nota al pie.
dropna: eliminar filas
customers.dropna(subset=["city"]) # drop rows with no city
products.dropna(subset=["unit_cost"]) # only products with a known cost
Pasa siempre subset=. Sin él, dropna() elimina cualquier fila con algún valor ausente, y en
customers eso tiraría un tercio de la tabla por la fuente de referencia.
Eliminar filas cambia tu población. Un desglose de referencias calculado tras dropna() describe
solo a los clientes que respondieron, lo que sobrestima la cuota de cada canal.
Cómo trata pandas los NaN en los cálculos
sum,mean,count,maxy compañía omiten los NaN por defecto.value_countsygroupbydejan fuera las claves NaN por defecto; usadropna=Falsepara conservarlas.- Las comparaciones con NaN son siempre False, incluso
np.nan == np.nan. Usaisna()para comprobar. - La aritmética con NaN da NaN:
unit_price - unit_costes NaN cuando falta el coste.
Así que el atajo para este nivel es también
customers["referral_source"].value_counts(dropna=False), que cuenta NaN como una fila propia.
Usar antes fillna("unknown") da a esa fila una etiqueta legible, lo cual es mejor para cualquier
cosa que vayas a mostrar a otras personas.
Errores comunes
- Informar cuotas tras
value_counts()sindropna=Falsenifillna. - Llamar a
dropna()sinsubsety perder la mayor parte de la tabla. - Rellenar huecos numéricos con 0 por reflejo.
- Comprobar
== np.nan, que nunca es True.
¡Linterna encendida!
Practicaste: nanisnafillnadropnavalue counts
- Resuelto
- Sin pistas
- Al primer intento
