Python : comment fusionner de multiples dataframes avec pandas (éviter l'erreur ValueError) ?
Grâce à la librairie pandas, il est possible de manipuler des DataFrames avec le langage Python. Ces DataFrames sont des représentations stockées dans des sources, généralement des bases de données. Il est possible de fusionner deux ou plusieurs DataFrames dans un seul. Il faut bien sûr qu'ils aient un élément commun mais ils doivent remplir aussi d'autres conditions.
Pour pouvoir fusionner plusieurs DataFrames, il faut d'abord qu'ils aient une colonne commune avec à l'intérieur le même type de données. Vous devez pour cela vérifier chaque DataFrame puis convertir les données pour ceux qui n'auraient pas le bon type. Si vous ne le faites pas, vous obtiendrez une erreur de type "ValueError" comme résultat. Pour convertir les données, la classe "dataframe" possède sa propre méthode, "astype". Elle s'applique sur une colonne et prend en paramètre le type dans lequel on souhaite convertir les données stockées dans la colonne. Vous devez trouver le type qui correspond le mieux aux données de la colonne en prenant en compte tous les DataFrames. Si par exemple, vous devez convertir des données en entier, avec pour certaines lignes la valeur "none", alors il est conseillé de convertir en "Int6'" plutôt que "Int", car la valeur "NaN" de pandas, qui correspond à "none", est de ce type.
# Les deux écritures suivantes produisent le même effet (une conversion en entier) monDataframe.maColonne.astype(int) monDataframe['maColonne'].astype(int)
Une fois vos données converties, la méthode la plus simple consiste à d'abord regrouper tous les DataFrames dans une liste. Ensuite, il existe la fonction "reduce()" qui permet d'appliquer une fonction à tous les éléments d'une liste. On va appliquer la méthode "merge()" de la classe "dataframe". Cette méthode permet de fusionner un DataFrame avec un autre. La méthode "reduce()" va prendre en paramètre les deux premiers éléments qui sont extraits lors du parcours de la liste. Dans le deuxième élément, on va appliquer la fonction "merge()" pour provoquer l'enchaînement des fusions. Si vous obtenez certaines valeurs non définies suite aux fusions, vous pouvez utiliser la fonction "fillna()" pour indiquer une valeur qui va remplacer ces valeurs.
# Import nécessaire pour utiliser la fonction reduce() avec Python 3 from functools import reduce # On réunit les DataFrames dans une liste maListe = [monDataframe, monDeuxiemeDf, monTroisiemeDf] # On les fusionne dataFrameFusionne = reduce(lambda left,right: pd.merge(left,right,on=['maColonne'], how='outer'), maListe) # Fusion avec remplissage des valeurs qui n'existent pas dataFrameFusionne = reduce(lambda left,right: pd.merge(left,right,on=['maColonne'], how='outer'), maListe).fillna('')