La fusion de tables avec Python

Fusion de deux tables avec Python

Pourquoi fusionner des tables ? Les données sont souvent réparties dans plusieurs tableaux. Par exemple, une table contenant des personnes, une autre les villes où elles vivent et une dernière avec les matières qu’elles étudient.

La fusion consiste à construire une nouvelle table en combinant les données de deux tables. On dispose de nombreux outils pour le faire (voir la modélisation avec Power BI). Ici, nous nous plaçons à un niveau de première générale avec utilisation de Python.

 

Principe

Table 1 : personnes

Nom Ville
Alice Paris
Bob Lyon
Chloé Paris

Table 2 : villes

Ville Région
Paris Île-de-France
Lyon Auvergne-Rhône-Alpes

Après fusion :

Nom Ville Région
Alice Paris Île-de-France
Bob Lyon Auvergne-Rhône-Alpes
Chloé Paris Île-de-France

La nouvelle table contient les informations des deux tables.

Pour fusionner deux tables, il faut une colonne commune. Ici, c’est Ville. Les valeurs possibles de cette colonne forment un domaine de valeurs : Paris, Lyon,  etc.

Paris

Une fusion fonctionne correctement seulement si les deux tables utilisent le même domaine de valeurs.

 

Avec Python

Comment fonctionne l’algorithme ?

  1. On parcourt chaque personne.
  2. On parcourt chaque ville.
  3. On compare les valeurs de la colonne commune Ville.
  4. Quand elles sont égales, on crée une nouvelle ligne.
  5. On ajoute cette ligne à la table résultat.

Piège classique : si une ville n’existe pas dans la seconde table, aucune ligne ne sera créée.

En Python, on peut réaliser une fusion avec des boucles et des listes de dictionnaires.

 

Exemple

Imaginons que l'on dispose de deux tables.

Table des élèves

Nom Classe
Alice 1G1
Bob 1G2
Chloé 1G1

En Python :

eleves = [
{"Nom": "Alice", "Classe": "1G1"},
{"Nom": "Bob", "Classe": "1G2"},
{"Nom": "Chloé", "Classe": "1G1"}
]

Table des classes

Classe Salle
1G1 B12
1G2 C03

En Python :

classes = [
{"Classe": "1G1", "Salle": "B12"},
{"Classe": "1G2", "Salle": "C03"}
]

Objectif : construire une nouvelle table contenant...

Nom Classe Salle
Alice 1G1 B12
Bob 1G2 C03
Chloé 1G1 B12

Pour cela, on utilise la colonne commune Classe.

Fonction :

def fusion(eleves, classes):
resultat = []

for eleve in eleves:
for classe in classes:

if eleve["Classe"] == classe["Classe"]:

ligne = {
"Nom": eleve["Nom"],
"Classe": eleve["Classe"],
"Salle": classe["Salle"]
}

resultat.append(ligne)

return resultat

Utilisation de la fonction :

table_fusionnee = fusion(eleves, classes)

for ligne in table_fusionnee:
print(ligne)

Affichage :

{'Nom': 'Alice', 'Classe': '1G1', 'Salle': 'B12'}
{'Nom': 'Bob', 'Classe': '1G2', 'Salle': 'C03'}
{'Nom': 'Chloé', 'Classe': '1G1', 'Salle': 'B12'}

 

fusion de tables