La principale différence entre la fusion et la concat est que la fusion vous permet d'effectuer une "jointure" plus structurée de tables, alors que l'utilisation de la concat est plus large et moins structurée.
Fusionner
En se référant à la documentation , pd.DataFrame.merge
prend droite en tant qu'argument obligatoire, ce qui peut être considéré comme une jointure entre la table de gauche et la table de droite selon une opération de jointure structurée prédéfinie. Notez la définition du paramètre droite .
Paramètres requis
-
droite : DataFrame ou série nommée
Paramètres facultatifs
-
comment : {'left', 'right', 'outer', 'inner'} default 'inner'
-
sur : étiquette ou liste
-
left_on : étiquette ou liste, ou tableau
-
right_on : étiquette ou liste, ou tableau
-
index_gauche : bool, default False
-
index_droit : bool, default False
-
trier : bool, default False
-
suffixes : tuple de (str, str), par défaut ('_x', '_y')
-
copie : bool, default True
-
indicateur : bool ou str, par défaut False
-
valider : str, facultatif
Important : pd.DataFrame.merge
exige le droit d'être un pd.DataFrame
ou nommé pd.Series
objet.
Sortie
En outre, si nous vérifions la documentation relative à l'opération de fusion sur pandas, elle est la suivante :
Effectuer une opération de fusion de base de données (SQL) entre deux DataFrame ou Séries en utilisant soit les colonnes comme clés, soit leurs index de ligne.
Concat
Se référer à documentation de pd.concat
il faut d'abord noter que le paramètre n'est nommé dans aucune des catégories suivantes table, data_frame, série, matrice etc., mais Objets à la place. En d'autres termes, vous pouvez passer plusieurs "conteneurs de données", qui sont définis comme suit :
Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]
Paramètres requis
-
Objets : une séquence ou un mappage d'objets Series ou DataFrame
Paramètres facultatifs
-
axe : {0/'index', 1/'colonnes'}, par défaut 0
-
rejoindre : {'inner', 'outer'}, par défaut 'outer'.
-
ignore_index : bool, default False
-
clés : séquence, par défaut None
-
niveaux : liste de séquences, par défaut None
-
noms : liste, par défaut None
-
vérifier_intégrité : bool, default False
-
trier : bool, default False
-
copie : bool, default True
Sortie
-
Renvoie à : objet, type d'objets
Exemple
Code
import pandas as pd
v1 = pd.Series([1, 5, 9, 13])
v2 = pd.Series([10, 100, 1000, 10000])
v3 = pd.Series([0, 1, 2, 3])
df_left = pd.DataFrame({
"v1": v1,
"v2": v2,
"v3": v3
})
df_right = pd.DataFrame({
"v4": [5, 5, 5, 5],
"v5": [3, 2, 1, 0]
})
df_concat = pd.concat([v1, v2, v3])
# Performing operations on default
merge_result = df_left.merge(df_right, left_index=True, right_index=True)
concat_result = pd.concat([df_left, df_right], sort=False)
print(merge_result)
print('='*20)
print(concat_result)
Sortie du code
v1 v2 v3 v4 v5
0 1 10 0 5 3
1 5 100 1 5 2
2 9 1000 2 5 1
3 13 10000 3 5 0
====================
v1 v2 v3 v4 v5
0 1.0 10.0 0.0 NaN NaN
1 5.0 100.0 1.0 NaN NaN
2 9.0 1000.0 2.0 NaN NaN
3 13.0 10000.0 3.0 NaN NaN
0 NaN NaN NaN 5.0 3.0
1 NaN NaN NaN 5.0 2.0
2 NaN NaN NaN 5.0 1.0
Vous pouvez toutefois obtenir la première sortie (fusion) avec concat en modifiant l'attribut axe paramètre
concat_result = pd.concat([df_left, df_right], sort=False, axis=1)
Observez le comportement suivant,
concat_result = pd.concat([df_left, df_right, df_left, df_right], sort=False)
sorties ;
v1 v2 v3 v4 v5
0 1.0 10.0 0.0 NaN NaN
1 5.0 100.0 1.0 NaN NaN
2 9.0 1000.0 2.0 NaN NaN
3 13.0 10000.0 3.0 NaN NaN
0 NaN NaN NaN 5.0 3.0
1 NaN NaN NaN 5.0 2.0
2 NaN NaN NaN 5.0 1.0
3 NaN NaN NaN 5.0 0.0
0 1.0 10.0 0.0 NaN NaN
1 5.0 100.0 1.0 NaN NaN
2 9.0 1000.0 2.0 NaN NaN
3 13.0 10000.0 3.0 NaN NaN
0 NaN NaN NaN 5.0 3.0
1 NaN NaN NaN 5.0 2.0
2 NaN NaN NaN 5.0 1.0
3 NaN NaN NaN 5.0 0.0
Vous ne pouvez pas effectuer une opération similaire avec la fusion, car elle ne permet qu'un seul DataFrame ou une seule série nommée.
merge_result = df_left.merge([df_right, df_left, df_right], left_index=True, right_index=True)
sorties ;
TypeError: Can only merge Series or DataFrame objects, a <class 'list'> was passed
Conclusion
Comme vous l'avez peut-être déjà remarqué, les entrées et les sorties peuvent être différentes entre "merge" et "concat".
Comme je l'ai mentionné au début, la toute première (principale) différence est que "merge" effectue une jointure plus structurée avec un ensemble restreint d'objets et de paramètres alors que "concat" effectue une jointure moins stricte/plus large avec un ensemble plus vaste d'objets et de paramètres.
Dans l'ensemble, merge est moins tolérant aux changements/(l'entrée) et "concat" est plus lâche/moins sensible aux changements/(l'entrée). Vous pouvez réaliser la "fusion" en utilisant la "concat", mais l'inverse n'est pas toujours vrai.
L'opération "Fusionner" utilise les colonnes du cadre de données (ou le nom de la colonne). pd.Series
) ou des indices de ligne, et puisqu'il utilise uniquement ces entités, il effectue une fusion horizontale des cadres de données ou des séries, et n'applique pas d'opération verticale en conséquence.
Si vous voulez en voir plus, vous pouvez plonger un peu dans le code source ;
5 votes
Aussi, connexe : stackoverflow.com/a/37891437/1972495 une discussion autour de
.merge()
y.join()
.3 votes
En ce qui concerne la fusion, la jonction et la concat, je constate que este réponse à être très clair sur la façon dont ils peuvent tous être utilisés pour faire la même chose (ils semblent être juste une interface alternative à la même fonctionnalité). Grâce à votre question (et à la réponse que vous mettez en lien dans le commentaire), je comprends enfin comment fusionner et joindre sont liés. Je ne sais toujours pas si concat utilise une implémentation différente ou non (je suppose que je vais devoir regarder le code source...).