Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Relier deux tableaux

Après cette leçon: Je peux relier deux tableaux par une colonne commune et vérifier que la jointure a fait ce que je voulais.

Leçon de 60 min7 commandesLab JupyterLab de science des données : pandas, Matplotlib et scikit-learn dans le navigateur

Les jours fériés sont-ils plus calmes ?

Le loueur de vélos a un tableau de locations et, à part, une liste de jours fériés. Il demande si ces jours-là sont plus calmes.

Aucun des deux tableaux ne répond seul. Les locations n’ont pas de colonne « férié », et la liste des fériés n’a pas de locations. Il faut les relier par la date qu’ils ont en commun.

À la fin de cette leçon

Remarque

Je peux relier deux tableaux par une colonne commune et vérifier que la jointure a fait ce que je voulais.

Mots-clés

MotCe que ça veut direExemple
Jointuremettre côte à côte les lignes de deux tableaux quand une colonne est égalemerge
Cléla colonne que les deux tableaux ont en commun, pour trouver les pairesdate
Jointure à gauchegarder toutes les lignes du premier tableau, avec ou sans partenaire
Jointure internegarder seulement les lignes qui ont un partenaire des deux côtés
Sans partenaireune ligne qui ne trouve rien dans l’autre tableau
Uniquequi n’apparaît qu’une fois dans une colonne

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Deux tableaux, une colonne commune

On range souvent les données dans plusieurs petits tableaux, pour écrire chaque fait une seule fois. La liste des fériés est écrite une fois, pas recopiée sur 365 lignes.

Pour servir des deux, on les relie. On choisit une colonne que les deux ont, la clé. Chaque ligne de l’un cherche les lignes de l’autre qui ont la même valeur de clé.

Fabriquer le second tableau

Appuyez sur Démarrer dans la barre de la leçon et attendez que le labo tourne. Le terminal n’a pas Python : chaque Lancer démarre une commande dans le labo avec docker exec jupyter.

Le labo ne contient que hires.csv. Le premier Lancer écrit un second fichier, jours-feries.csv, avec huit jours fériés de 2025.

Écrire la liste des fériés

Commande
docker exec jupyter sh -c "printf '%s\n' 'date,ferie' '2025-01-01,Nouvel An' '2025-04-21,Lundi de Pâques' '2025-05-01,Fête du Travail' '2025-05-08,Victoire 1945' '2025-07-14,Fête nationale' '2025-08-15,Assomption' '2025-11-11,Armistice' '2025-12-25,Noël' > jours-feries.csv"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

La relire

Commande
docker exec jupyter cat jours-feries.csv

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

La jointure à gauche garde toutes vos lignes

Une jointure à gauche part du premier tableau. Toutes ses lignes restent. Si une ligne trouve un partenaire, les nouvelles colonnes sont remplies. Sinon, elles restent vides.

C’est le choix prudent pour ajouter de l’information à un tableau. Ajouter une colonne ne peut pas faire perdre un jour.

Exemple travaillé : trois jours reliés

datelocationsferie
2025-04-20298(vide)
2025-04-21232Lundi de Pâques
2025-04-22279(vide)

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Relier et montrer les fériés

Commande
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('jours-feries.csv'); j=h.merge(b, on='date', how='left'); print(len(h), len(b), len(j)); print(j['ferie'].notna().sum()); print(j[j['ferie'].notna()][['date','weekday','ferie','hires']].to_string(index=False))"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Une jointure faite à la main en Python

Code: python
# Jointure à la main : chaque ligne de locations cherche sa date dans les fériés.
locations = [["2025-04-20", 298], ["2025-04-21", 232], ["2025-04-22", 279]]
feries = {"2025-04-21": "Lundi de Pâques"}
for ligne in locations:
    date = ligne[0]
    nom = "aucun"
    if date in feries:
        nom = feries[date]
    print(date, ligne[1], nom)
# Ajoutez "2025-04-22": "Mardi" aux fériés et relancez.

À gauche, interne et externe

Une jointure interne garde seulement les lignes qui ont un partenaire des deux côtés. Une jointure externe garde toutes les lignes des deux tableaux, avec ou sans partenaire.

Le choix change le nombre de lignes, donc tous les nombres calculés ensuite. Dites quelle jointure vous avez utilisée, et pourquoi.

Compter les lignes de chaque sorte de jointure

Commande
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('jours-feries.csv'); print(len(h.merge(b, on='date', how='inner')), len(h.merge(b, on='date', how='left')), len(h.merge(b, on='date', how='outer')))"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Regrouper, puis lire la taille de chaque groupe

Une fois reliés, posez la question. Marquez chaque jour comme férié ou non, gardez les jours de semaine, puis prenez la moyenne des locations pour chaque groupe.

Regardez combien de jours il y a dans chaque groupe. Une moyenne sur huit jours est une preuve bien plus faible qu’une moyenne sur 253.

Fériés et jours ordinaires de semaine

Commande
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('jours-feries.csv'); j=h.merge(b, on='date', how='left'); j['ferie_ou_non']=j['ferie'].notna(); w=j[j['weekday'].isin(['Mon','Tue','Wed','Thu','Fri'])]; print(w.groupby('ferie_ou_non')['hires'].agg(['count','mean']).round(1))"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Une clé répétée multiplie les lignes

Si la clé se répète dans le second tableau, une ligne du premier trouve chaque copie et s’écrit une fois pour chacune. Le tableau grossit, et tous les totaux suivants sont trop grands.

Pandas peut le vérifier. Donnez validate="one_to_one" : il s’arrête avec une erreur si une clé n’est pas unique.

Répéter un férié et relier de nouveau

Commande
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('jours-feries.csv'); b=pd.concat([b, b.iloc[[0]]]); print(len(h.merge(b, on='date', how='left')), b['date'].is_unique)"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Demander à pandas de refuser

Commande
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('jours-feries.csv'); b=pd.concat([b, b.iloc[[0]]]); h.merge(b, on='date', how='left', validate='one_to_one')" 2>&1 | tail -n 1

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Une erreur fréquente

Attention

Beaucoup pensent qu’une jointure à gauche ne peut pas changer le nombre de lignes. Elle peut l’augmenter. Elle ne perd jamais une ligne du premier tableau, mais une clé répétée en fait des copies. Comparez les nombres de lignes avant et après.

Pour aller plus loin : le lendemain

Dans votre carnet, reliez de nouveau les fériés à hires.csv. Puis calculez la moyenne des locations le lendemain de chaque férié.

Indice : ajoutez un jour à chaque date de férié avec pd.to_datetime(...) + pd.Timedelta(days=1) avant de relier. Dites d’abord ce que vous attendez.

À propos de ce labo et de sa source: Lab JupyterLab de science des données : pandas, Matplotlib et scikit-learn dans le navigateur

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.