Groupby et jointures simples
Agréger par groupe et enrichir sans dupliquer.
Énoncé
Depuis data/colis_bruts.csv, calculez le prix moyen et le nombre de commandes par transporteur. Construisez ensuite un petit référentiel fictif qui associe chaque transporteur à une zone et joignez-le au CSV. À ce stade, les doublons sont encore présents : notez leur effet sur les comptes. Refaites le groupement après clean.py.
Contraintes
Vérifiez les clés avant de joindre : un seul enregistrement par nom dans le référentiel, aucune multiplication silencieuse des lignes. La zone ajoutée ici est pédagogique, pas une propriété réelle des transporteurs.
Indices
df.groupby("transporteur")["prix_eur"].agg(["mean", "count"]). pd.merge(..., on="transporteur", how="left", validate="m:1") exige une correspondance plusieurs-vers-un.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
import pandas as pd
colis = pd.read_csv("data/colis_bruts.csv")
transporteurs = pd.DataFrame({
"transporteur": ["Alpha", "Beta", "Gamma"],
"zone_fictive": ["nord", "centre", "sud"],
})
assert transporteurs["transporteur"].is_unique
stats = colis.groupby("transporteur")["prix_eur"].agg(["mean", "count"])
print(stats)
enrichi = pd.merge(
colis, transporteurs, on="transporteur", how="left", validate="m:1"
)
assert len(enrichi) == len(colis)
assert enrichi["zone_fictive"].notna().all()
La jointure ajoute une description, mais ne nettoie pas les commandes. Si validate lève, la clé du référentiel n'est pas unique : corrigez-la avant de modéliser. Une jointure qui multiplie les lignes gonfle le train et fausse toutes les métriques.