Aller au contenu

T3.3 Fusion (par jointure) de tables⚓︎

Lorsqu'on travaille sur des données, il est fréquent de manipuler plusieurs tables dans lesquelles les mêmes données peuvent se trouver, avec différents champs. Par exemple voici une nouvelle table (à créer dans un fichier CSV, puis à importer pour manipulation):

Nom Affiliation
Dark Vador Empire
Obi-Wan Kenobi République
R2-D2 République
Rey Rébellion
Han Solo Rébellion
Grand Moff Tarkin Empire
Leia Organa Rébellion
C-3PO République
Luke Skywalker Rébellion
Padmé Amidala République
Dark Sidious Empire

On peut donc vouloir les fusionner, c'est-à-dire construire une nouvelle table qui contient les données des deux tables, à condition qu'elles possèdent un champ commun, sur lequel on procède à l'opération de jointure. Ici le champ commun est 'Nom', et on obtiendrait la table suivante:

Nom Espèce Force Statut Affiliation
Dark Vador Humain oui Sith Empire
Obi-Wan Kenobi Humain oui Jedi République
R2-D2 Droïde non Astromécano République
Rey Humain oui Jedi Rébellion
Han Solo Humain non Contrebandier Rébellion
Leia Organa Humain oui Sénatrice Rébellion
C-3PO Droïde non Protocole République
Luke Skywalker Humain oui Jedi Rébellion
Padmé Amidala Humain non Sénatrice République
Dark Sidious Humain oui Sith Empire

On ne conserve bien évidemment que les enregistrements existants dans les deux tables.

Fusion par jointure

La fusion par jointure consiste à :

  • créer une table vide qui accueillera les enregistrements contruits en fusionnant ceux des deux tables;
  • parcourir les enregistrements de la première table;
  • pour chacun des enregistrements de la deuxième table, regarder si les enregistrements ont la même valeur pour le champ commun;
  • si c'est le cas, créer une copie de l'enregistrement de la première table, à laquelle on ajoute les données (champ: valeur) de la deuxième table.
Jointure de deux tables
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def fusion(table1: list, table2: list, champ: str) -> list:
    nouvelle_table = ...
    for ligne1 in table1:
        for ligne2 in table2:
            if ...:
                ligne = dict(ligne1)
                for cle in ...:
                    ...
                        ligne[cle] = ...
                nouvelle_table.append(...)
    return ...