Supposons que j'ai deux DataFrames comme ceci:
left = pd.DataFrame({'key1': ['foo', 'bar'], 'lval': [1, 2]})
right = pd.DataFrame({'key2': ['foo', 'bar'], 'rval': [4, 5]})
Je veux les fusionner, alors j'essaye quelque chose comme ceci:
pd.merge(left, right, left_on='key1', right_on='key2')
Et je suis content
key1 lval key2 rval
0 foo 1 foo 4
1 bar 2 bar 5
Mais j'essaie d'utiliser la méthode de jointure, qui m'a amené à croire qu'elle est assez similaire.
left.join(right, on=['key1', 'key2'])
Et je reçois ceci:
//anaconda/lib/python2.7/site-packages/pandas/tools/merge.pyc in _validate_specification(self)
406 if self.right_index:
407 if not ((len(self.left_on) == self.right.index.nlevels)):
--> 408 raise AssertionError()
409 self.right_on = [None] * n
410 elif self.right_on is not None:
AssertionError:
Qu'est-ce que je rate?
merge
joint les colonnes deleft
aux colonnes deright
, ce qui est ce que vous voulez, maisjoin(... on=[...])
joint les colonnes deleft
pour indexer les clés deright
, ce qui n'est pas ce que vous voulez. Voir ma réponse ci-dessous pour plus de détails.on
option) avec lesother
index de. N'oubliez pas, les index de jointure. Alors que merge () est une méthode plus générique.Réponses:
J'utilise toujours
join
sur les indices:La même fonctionnalité peut être obtenue en utilisant
merge
les colonnes suivantes:la source
right
soit à la même profondeur que la longueuron
. Cela a du sens pour moi en quelque sorte. Je peux accepter que la sémantique soit différente. Mais j'aimerais savoir si je peux obtenir ce même comportement avec df.joinpandas.merge()
est la fonction sous-jacente utilisée pour tous les comportements de fusion / jointure.Les DataFrames fournissent les méthodes
pandas.DataFrame.merge()
etpandas.DataFrame.join()
comme un moyen pratique d'accéder aux capacités depandas.merge()
. Par exemple,df1.merge(right=df2, ...)
est équivalent àpandas.merge(left=df1, right=df2, ...)
.Ce sont les principales différences entre
df.join()
etdf.merge()
:df1.join(df2)
joint toujours via l'index dedf2
, maisdf1.merge(df2)
peut se joindre à une ou plusieurs colonnes dedf2
(par défaut) ou à l'index dedf2
(avecright_index=True
).df1.join(df2)
utilise l'index dedf1
etdf1.merge(df2)
utilise les colonnes dedf1
. Cela peut être annulé en spécifiantdf1.join(df2, on=key_or_keys)
oudf1.merge(df2, left_index=True)
.df1.join(df2)
effectue une jointure gauche par défaut (conserve toutes les lignes dedf1
), maisdf.merge
effectue une jointure interne par défaut (retourne uniquement les lignes correspondantes dedf1
etdf2
).Donc, l'approche générique consiste à utiliser
pandas.merge(df1, df2)
oudf1.merge(df2)
. Mais pour un certain nombre de situations courantes (conserver toutes les lignes dedf1
et se joindre à un indexdf2
), vous pouvez enregistrer une saisie en utilisant à ladf1.join(df2)
place.Quelques notes sur ces problèmes dans la documentation à http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging :
...
la source
on=key_or_keys
pour changer la façon dont les lignes sont trouvées dans le bon tableau. Mais ce n'est pas vraiment le cas. L'on
argument modifie la recherche sur la table de gauche (df1
) de l'index en colonne (s). Cependant, même avec cet argument, la bonne table (df2
) sera mise en correspondance via son index. (Voir le dernier exemple ci-dessus.)Je pense que ce
join()
n'est qu'une méthode pratique. Essayezdf1.merge(df2)
plutôt, ce qui vous permet de spécifierleft_on
etright_on
:la source
De cette documentation
Et :
la source
L'une des différences est la
merge
création d'un nouvel index et lajoin
conservation de l'index du côté gauche. Cela peut avoir une grande conséquence sur vos transformations ultérieures si vous supposez à tort que votre index n'est pas modifié avecmerge
.Par exemple:
-
-
-
la source
on
le paramètre a une signification différente dans les deux casla source
Pour le mettre de manière analogue à SQL, «la fusion Pandas est une jointure externe / interne et la jointure Pandas est une jointure naturelle». Par conséquent, lorsque vous utilisez la fusion dans pandas, vous souhaitez spécifier le type de jointure sqlish que vous souhaitez utiliser, tandis que lorsque vous utilisez la jointure pandas, vous voulez vraiment avoir une étiquette de colonne correspondante pour vous assurer qu'elle se joint
la source