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