La solicitud

De Andrew Ramos, Gerente de Marketing
Tu objetivo
Asigna a result un diccionario que asocie cada canal de channels con el número de veces que aparece, por ejemplo {'web': 6, ...}. Cada canal de la lista debe aparecer como clave.
- Guarda un dict en
resultpendiente
Tu código
Cargando el editor…
Solución de referencia
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Andrew, y por qué
La lección
La pregunta más común del análisis
«¿Cuántos de cada uno?» es la pregunta que responderás con más frecuencia como analista: pedidos por canal, clientes por estado, devoluciones por motivo. En Python puro, un diccionario es la herramienta natural, porque cada categoría se convierte en una clave y su conteo en el valor.
Contar con get
El truco está en manejar la primera vez que ves una categoría, cuando su clave aún no existe. .get
con un valor por defecto de 0 lo resuelve en una línea:
counts = {}
for channel in channels:
counts[channel] = counts.get(channel, 0) + 1
Repasa las primeras pasadas:
"web": no está encounts, así quegetdevuelve 0 ycounts["web"]pasa a ser 1."app": tampoco está, así quecounts["app"]pasa a ser 1."web": ya vale 1, así que pasa a ser 2.
Al final, cada canal distinto es una clave y los valores suman len(channels). Ese último dato es una
comprobación rápida que conviene que te hagas costumbre ejecutar:
sum(counts.values()) == len(channels) # True
La versión más larga con un if hace lo mismo y conviene reconocerla cuando leas el código de otras
personas:
if channel in counts:
counts[channel] += 1
else:
counts[channel] = 1
El atajo: Counter
La biblioteca estándar de Python tiene un diccionario hecho justo para esto:
from collections import Counter
Counter(channels)
# Counter({'web': 6, 'app': 4, 'marketplace': 2})
Counter(channels).most_common(1) # [('web', 6)]
Un Counter se comporta como un diccionario, y es igual a un diccionario normal con los mismos
conteos. En el trabajo real usarás Counter o, más probablemente, el value_counts() de pandas, que
conocerás en el capítulo 4. Escribir el bucle una vez tú mismo sigue valiendo la pena: es la misma
lógica que usan esas herramientas, y a los entrevistadores les gusta pedirlo sin importaciones.
Contar con condiciones
Como es un bucle normal, puedes añadir reglas. Cuenta solo los canales que no estén vacíos, o normaliza primero el texto desordenado:
for channel in raw_channels:
key = channel.strip().lower()
if key:
counts[key] = counts.get(key, 0) + 1
if key: se salta el texto vacío: un string vacío "" cuenta como falso en una condición, así que los
canales en blanco se dejan fuera. Sin el .strip().lower(), "Web", "web " y "web" se contarían
como tres canales distintos, un clásico error de calidad de datos que corregirás como es debido en el
capítulo de limpieza.
Errores comunes
- Escribir
counts[channel] += 1sin un valor por defecto. Falla conKeyErroren el primer canal nuevo. - Crear
counts = {}dentro del bucle, lo que lo borra en cada pasada. - Contar con una lista y
.count()para cada valor, comochannels.count("web"). Funciona con tres canales, pero tienes que conocer las categorías de antemano y recorre la lista de nuevo cada vez.
La versión en pandas
Cuando los pedidos están en un DataFrame, todo este bucle se convierte en una línea:
orders["channel"].value_counts(). Devuelve los mismos conteos, ordenados de más a menos comunes.
Escribir el bucle una vez te muestra exactamente qué hace esa línea por ti.
¡Linterna encendida!
Practicaste: dictionariescountinggetfor loop
- Resuelto
- Sin pistas
- Al primer intento
