Pandas Python - Fusionner / Rejoindre

Pandas propose des opérations de jointure en mémoire hautes performances et complètes, idiomatiquement très similaires aux bases de données relationnelles telles que SQL.

Pandas fournit une seule fonction, merge, comme point d'entrée pour toutes les opérations de jointure de base de données standard entre les objets DataFrame -

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True)

Ici, nous avons utilisé les paramètres suivants -

  • left - Un objet DataFrame.

  • right - Un autre objet DataFrame.

  • on- Colonnes (noms) à rejoindre. Doit être trouvé dans les objets DataFrame gauche et droit.

  • left_on- Colonnes du DataFrame gauche à utiliser comme clés. Il peut s'agir de noms de colonnes ou de tableaux de longueur égale à la longueur du DataFrame.

  • right_on- Colonnes du bon DataFrame à utiliser comme clés. Il peut s'agir de noms de colonnes ou de tableaux de longueur égale à la longueur du DataFrame.

  • left_index - Si True,utilisez l'index (étiquettes de ligne) du DataFrame gauche comme clé (s) de jointure. Dans le cas d'un DataFrame avec un MultiIndex (hiérarchique), le nombre de niveaux doit correspondre au nombre de clés de jointure du DataFrame droit.

  • right_index - Même usage que left_index pour le bon DataFrame.

  • how- Un des «gauche», «droite», «extérieur», «intérieur». La valeur par défaut est interne. Chaque méthode a été décrite ci-dessous.

  • sort- Trier le résultat DataFrame par les clés de jointure dans l'ordre lexicographique. La valeur par défaut est True, la définition sur False améliorera considérablement les performances dans de nombreux cas.

Créons maintenant deux DataFrames différents et effectuons les opérations de fusion dessus.

# import the pandas library
import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame(
   {'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print left
print right

Ses output est comme suit -

Name  id   subject_id
0   Alex   1         sub1
1    Amy   2         sub2
2  Allen   3         sub4
3  Alice   4         sub6
4  Ayoung  5         sub5

    Name  id   subject_id
0  Billy   1         sub2
1  Brian   2         sub4
2  Bran    3         sub3
3  Bryce   4         sub6
4  Betty   5         sub5

Fusionner deux DataFrames sur une clé

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
	'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on='id')

Ses output est comme suit -

Name_x   id  subject_id_x   Name_y   subject_id_y
0  Alex      1          sub1    Billy           sub2
1  Amy       2          sub2    Brian           sub4
2  Allen     3          sub4     Bran           sub3
3  Alice     4          sub6    Bryce           sub6
4  Ayoung    5          sub5    Betty           sub5

Fusionner deux DataFrames sur plusieurs clés

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
	'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on=['id','subject_id'])

Ses output est comme suit -

Name_x   id   subject_id   Name_y
0    Alice    4         sub6    Bryce
1   Ayoung    5         sub5    Betty

Fusionner en utilisant l'argument «comment»

le howL'argument à fusionner spécifie comment déterminer les clés à inclure dans la table résultante. Si aucune combinaison de touches n'apparaît dans les tables de gauche ou de droite, les valeurs de la table jointe seront NA.

Voici un résumé de la how options et leurs noms équivalents SQL -

Merge, méthode Équivalent SQL La description
la gauche JOINTURE EXTERNE GAUCHE Utiliser les clés de l'objet gauche
droite JOINTURE EXTÉRIEURE DROITE Utiliser les clés de l'objet droit
extérieur JOINTURE EXTÉRIEURE PLEINE Utiliser l'union des clés
interne JOINTURE INTERNE Utiliser l'intersection des touches

Joint gauche

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='left')

Ses output est comme suit -

Name_x   id_x   subject_id   Name_y   id_y
0     Alex      1         sub1      NaN    NaN
1      Amy      2         sub2    Billy    1.0
2    Allen      3         sub4    Brian    2.0
3    Alice      4         sub6    Bryce    4.0
4   Ayoung      5         sub5    Betty    5.0

Jointure droite

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='right')

Ses output est comme suit -

Name_x  id_x   subject_id   Name_y   id_y
0      Amy   2.0         sub2    Billy      1
1    Allen   3.0         sub4    Brian      2
2    Alice   4.0         sub6    Bryce      4
3   Ayoung   5.0         sub5    Betty      5
4      NaN   NaN         sub3     Bran      3

Jointure externe

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, how='outer', on='subject_id')

Ses output est comme suit -

Name_x  id_x   subject_id   Name_y   id_y
0     Alex   1.0         sub1      NaN    NaN
1      Amy   2.0         sub2    Billy    1.0
2    Allen   3.0         sub4    Brian    2.0
3    Alice   4.0         sub6    Bryce    4.0
4   Ayoung   5.0         sub5    Betty    5.0
5      NaN   NaN         sub3     Bran    3.0

Jointure interne

L'adhésion sera effectuée sur l'index. L'opération de jointure honore l'objet sur lequel elle est appelée. Alors,a.join(b) n'est pas égal à b.join(a).

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='inner')

Ses output est comme suit -

Name_x   id_x   subject_id   Name_y   id_y
0      Amy      2         sub2    Billy      1
1    Allen      3         sub4    Brian      2
2    Alice      4         sub6    Bryce      4
3   Ayoung      5         sub5    Betty      5