Jointure de tables☘
Lorsque les données à traiter sont en très grand nombre, elles sont généralement réparties dans plusieurs tables. On peut donc être amené à devoir regrouper ces données dans une seule table pour ensuite les exploiter.
Définition
L'opération de fusion de plusieurs tables s'appelle jointure.
Pour fusionner deux tables différentes, c'est-à-dire obtenir une unique table à partir de deux, il faut qu'elles aient au moins un attribut commun.
Exemple avec le module fonctions_csv.py
☘
On considère :
-
la table Personnes :
id_client nom prénom 1 Labrosse Adam 2 Gemlamorte Adèle 3 Auboisdormant Abel 4 Etpan Ahmed 5 Térieur Alain -
la table Commandes :
id_commande id_client descriptif 1 2 bouilloire 2 5 couverture 3 4 VTT 4 4 smartphone 5 1 cahiers
Le numéro d'identification du client id_client
est un attribut commun
à ces deux tables, on peut donc les fusionner, c'est-à-dire construire un
tableau de dictionnaires dans lequel chaque dictionnaire se présente sous
la forme suivante :
{'id_client': ..., 'nom': ..., 'prenom': ..., 'id_commande': ..., 'descriptif': ...}
-
Ouvrez un éditeur Python puis copiez/collez les tables de données suivantes :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
from fonctions_csv import * personnes = [{'id_client': 1, 'nom': 'Labrosse', 'prenom': 'Adam'}, {'id_client': 2, 'nom': 'Gemlamorte', 'prenom': 'Adèle'}, {'id_client': 3, 'nom': 'Auboisdormant', 'prenom': 'Abel'}, {'id_client': 4, 'nom': 'Etpan', 'prenom': 'Ahmed'}, {'id_client': 5, 'nom': 'Térieur', 'prenom': 'Alain'}] commandes = [{'id_commande': 1, 'id_client': 2, 'descriptif': 'bouilloire'}, {'id_commande': 2, 'id_client': 5, 'descriptif': 'couverture'}, {'id_commande': 3, 'id_client': 4, 'descriptif': 'VTT'}, {'id_commande': 4, 'id_client': 4, 'descriptif': 'smartphone'}, {'id_commande': 5, 'id_client': 1, 'descriptif': 'cahiers'}] personnes_commandes = ...
-
Pour fusionner les deux tables, le module
fonctions.csv
contient la fonctionjointure()
dont l'utilisation est décrite ci-dessous :
En utilisant cette fonction, réaliser la jointure (en ligne 15) entre les tables1
Table_Resultat = jointure(Nom_Table1, Nom_Table2, attribut_commun)
personnes
etcommandes
. Cette jointure sera stockée dans la variablepersonnes_commandes
.Fonction
jointure()
Cette fonction est définie dans le module
fonctions_csv.py
.
Il est inutile de recopier le code ci-dessous, importer ce module permettra d'utiliser la fonctionjointure()
. Toutefois, à ce stade de l'année, il faut être capable de comprendre ce code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
from copy import deepcopy def jointure(table1, table2, attribut1, attribut2=None): if attribut2 is None: attribut2 = attribut1 new_table = [] for dico1 in table1: for dico2 in table2: if dico1[attribut1] == dico2[attribut2]: new_dico = deepcopy(dico1) for attribut in dico2: if attribut != attribut2: new_dico[attribut] = dico2[attribut] new_table.append(new_dico) return new_table
- Ligne 1 : on importe le module
deepcopy
afin d'éviter les problème de recopie de tableau de dictionnaires et les effets de bord (rappelez-vous le chapitre Portée des variables). - Ligne 3 : L'
attribut2
a une valeur par défaut :None
, c'est-à-dire qu'il peut ne pas être présent. - Lignes 4 et 5 : Quand l'
attribut2
n'est pas présent, cela signifie que les attributs de jointure portent le même nom. - Ligne 6 : La future table, qui est au départ un tableau vide.
- Ligne 9 : On ne considère que les dictionnaires de
table1
ettable2
qui ont des valeurs identiques pour lesattribut1
etattribut2
. - Ligne 10 : On recopie entièrement le dictionnaire de la
table1
dans un nouveau dictionnaire. - Lignes 11 à 13 : On ajoute dans ce nouveau dictionnaire les attributs
de chaque dictionnaire correspondant de
table2
sans accepter à nouveau la valeur de l'attribut de jointure.
Tests dans la console
Vérifiez que vous obtenez les résultats suivants lors de l'appel dans la console :
>>> personnes_commandes [{'id_client': 1, 'nom': 'Labrosse', 'prenom': 'Adam', 'id_commande': 5, 'descriptif': 'cahiers'}, {'id_client': 2, 'nom': 'Gemlamorte', 'prenom': 'Adèle', 'id_commande': 1, 'descriptif': 'bouilloire'}, {'id_client': 4, 'nom': 'Etpan', 'prenom': 'Ahmed', 'id_commande': 3, 'descriptif': 'VTT'}, {'id_client': 4, 'nom': 'Etpan', 'prenom': 'Ahmed', 'id_commande': 4, 'descriptif': 'smartphone'}, {'id_client': 5, 'nom': 'Térieur', 'prenom': 'Alain', 'id_commande': 2, 'descriptif': 'couverture'}]
Une solution
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
from fonctions_csv import * personnes = [{'id_client': 1, 'nom': 'Labrosse', 'prenom': 'Adam'}, {'id_client': 2, 'nom': 'Gemlamorte', 'prenom': 'Adèle'}, {'id_client': 3, 'nom': 'Auboisdormant', 'prenom': 'Abel'}, {'id_client': 4, 'nom': 'Etpan', 'prenom': 'Ahmed'}, {'id_client': 5, 'nom': 'Térieur', 'prenom': 'Alain'}] commandes = [{'id_commande': 1, 'id_client': 2, 'descriptif': 'bouilloire'}, {'id_commande': 2, 'id_client': 5, 'descriptif': 'couverture'}, {'id_commande': 3, 'id_client': 4, 'descriptif': 'VTT'}, {'id_commande': 4, 'id_client': 4, 'descriptif': 'smartphone'}, {'id_commande': 5, 'id_client': 1, 'descriptif': 'cahiers'}] personnes_commandes = jointure(personnes, commandes, 'id_client')
- Ligne 1 : on importe le module
-
Quelle remarque pouvez-vous faire sur la table
personnes_commandes
obtenue ? Est-ce cohérent ?Une réponse
On peu remarquer que le client numéro
'3'
n'apparaît pas dans la tablepersonnes_commandes
. Cela semble cohérent puisqu'il n'a effectué aucun commande...
Cas particulier☘
Dans certaines tables, l'attribut commun peut avoir une autre appellation
mais le même champs de valeurs.
C'est le cas de la table Commandes2 par exemple :
ident_commande | ident_client | descriptif |
---|---|---|
1 | 5 | switch |
2 | 2 | chocolat |
La fonction jointure()
présente dans le module fonctions_csv
permet de
préciser l'attribut de la seconde table pour les mettre en relation :
1 |
|
Ce qui donne pour notre exemple :
1 |
|