Comment fusionner plusieurs Pandas DataFrames basés sur plusieurs colonnes ?

La manière la plus courante d'effectuer une fusion sur plusieurs colonnes est d'utiliser la fonction "merge" en Python. Cette fonction vous permet de spécifier les colonnes qui doivent être utilisées pour la fusion, ainsi que tout paramètre supplémentaire qui peut être requis. Pour utiliser cette fonction, vous devez fournir les DataFrames qui doivent être fusionnés et une liste des colonnes utilisées pour la fusion. Une fois cela fait, la fonction "merge" combinera les DataFrames en fonction de ces colonnes. Exemples :

Étude de cas

Prenons un exemple concret. Nous avons plusieurs DataFrames qui fournissent deux colonnes détaillant la longitude et la latitude respectives, ainsi qu'une colonne avec des mesures de FRP (Fire Radiative Power) pour chaque jour. Nous souhaitons fusionner tous ces DataFrames afin d'analyser la variation du FRP au fil du temps.

Générons 3 DataFrame en utilisant des données synthétiques :

import pandas as pd
import numpy as np

d = {'longitude':[-120,-80,-20,40,60], 
     'latitude':[-10,10,20,40,60],
     'FRP_2023_02_01':[random.uniform(0,1) * (100) for i in range(5)]}

df1 = pd.DataFrame(data=d)

print(df1)

d = {'longitude':[-120,-80,-20,40,60], 
     'latitude':[-10,10,20,-40,-10],
     'FRP_2023_02_02':[random.uniform(0,1) * (100) for i in range(5)]}

df2 = pd.DataFrame(data=d)

print(df2)

d = {'longitude':[-20,-80,-20,40,60], 
     'latitude':[-10,10,20,-40,-10],
     'FRP_2023_02_03':[random.uniform(0,1) * (100) for i in range(5)]}

df3 = pd.DataFrame(data=d)

print(df3)

Le code affiché ci-dessus générera par exemple

DataFrame df1:

   longitude  latitude  FRP_2023_02_01
0       -120       -10       21.685477
1        -80        10       51.935383
2        -20        20       91.883848
3         40        40       80.616483
4         60        60        3.592461

DataFrame df2:

   longitude  latitude  FRP_2023_02_02
0       -120       -10        6.559510
1        -80        10       64.989729
2        -20        20       77.417787
3         40       -40       67.909856
4         60       -10       14.007092

DataFrame df3:

   longitude  latitude  FRP_2023_02_03
0        -20       -10       21.228505
1        -80        10       45.973927
2        -20        20       42.744729
3         40       -40        3.814573
4         60       -10       34.757743

Fusionner deux DataFrames en fonction de deux colonnes.

Pour fusionner par exemple les DataFrames df1 et df2 en fonction des colonnes de longitude et de latitude :

pd.merge(df1,df2, on=['longitude','latitude'], how='outer')

sortie

   longitude  latitude  FRP_2023_02_01  FRP_2023_02_02
0       -120       -10       21.685477        6.559510
1        -80        10       51.935383       64.989729
2        -20        20       91.883848       77.417787
3         40        40       80.616483             NaN
4         60        60        3.592461             NaN
5         40       -40             NaN       67.909856
6         60       -10             NaN       14.007092

Remarquez si nous utilisons l'option 'inner' à la place.

pd.merge(df1,df2, on=['longitude','latitude'], how='inner')

Le code ci-dessus générera le DataFrame suivant.

   longitude  latitude  FRP_2023_02_01  FRP_2023_02_02
0       -120       -10       21.685477        6.559510
1        -80        10       51.935383       64.989729
2        -20        20       91.883848       77.417787

Fusionner plusieurs DataFrames en fonction de deux colonnes.

Maintenant, que se passe-t-il si nous voulons fusionner non seulement deux, mais plusieurs DataFrames. Nous pouvons répéter le code ci-dessus, mais une autre façon plus efficace de le faire est d'utiliser la fonction reduce de Python du module functools :

from functools import reduce

df_list = [df1,df2,df3]
columns = ['longitude','latitude']

df_aggregated = reduce(lambda x,y: pd.merge(x,y, on=columns, how='outer'), df_list)

Le code ci-dessus générera ensuite le DataFrame suivant :

   longitude  latitude  FRP_2023_02_01  FRP_2023_02_02  FRP_2023_02_03
0       -120       -10       21.685477        6.559510             NaN
1        -80        10       51.935383       64.989729       45.973927
2        -20        20       91.883848       77.417787       42.744729
3         40        40       80.616483             NaN             NaN
4         60        60        3.592461             NaN             NaN
5         40       -40             NaN       67.909856        3.814573
6         60       -10             NaN       14.007092       34.757743
7        -20       -10             NaN             NaN       21.228505

Résultat si nous utilisons l'option 'inner':

df_aggregated = reduce(lambda x,y: pd.merge(x,y, on=columns, how='inner'), df_list)

Cela va générer:

   longitude  latitude  FRP_2023_02_01  FRP_2023_02_02  FRP_2023_02_03
0        -80        10       51.935383       64.989729       45.973927
1        -20        20       91.883848       77.417787       42.744729

Références

Liens Site
merge() pandas.pydata.org
reduce() docs.python.org