Angenommen, ich habe zwei DataFrames wie folgt:
left = pd.DataFrame({'key1': ['foo', 'bar'], 'lval': [1, 2]})
right = pd.DataFrame({'key2': ['foo', 'bar'], 'rval': [4, 5]})
Ich möchte sie zusammenführen, also versuche ich so etwas:
pd.merge(left, right, left_on='key1', right_on='key2')
Und ich bin glücklich
key1 lval key2 rval
0 foo 1 foo 4
1 bar 2 bar 5
Aber ich versuche, die Join-Methode zu verwenden, von der ich angenommen habe, dass sie ziemlich ähnlich ist.
left.join(right, on=['key1', 'key2'])
Und ich verstehe das:
//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:
Was vermisse ich?
merge
Spalten vonleft
mit Spalten von verbunden werdenright
, was Sie möchten, aberjoin(... on=[...])
Spalten vonleft
mit Indexschlüsseln von verknüpfenright
, was nicht das ist, was Sie möchten. Siehe meine Antwort unten für weitere Details.on
Option angegeben) mit denother
Indizes des Anrufers abgleichen . Denken Sie daran, Indizes für die Verknüpfung. Während merge () eine allgemeinere Methode ist.Antworten:
Ich benutze immer
join
auf Indizes:Dieselbe Funktionalität kann durch Verwendung
merge
der folgenden Spalten erreicht werden:quelle
right
dieselbe Tiefe wie die Länge haton
. Das macht für mich irgendwie Sinn. Ich kann akzeptieren, dass die Semantik anders ist. Aber ich würde gerne wissen, ob ich das gleiche Verhalten mit df.joinpandas.merge()
ist die zugrunde liegende Funktion, die für das gesamte Zusammenführungs- / Verknüpfungsverhalten verwendet wird.DataFrames bieten die Methoden
pandas.DataFrame.merge()
undpandas.DataFrame.join()
als bequeme Möglichkeit, auf die Funktionen von zuzugreifenpandas.merge()
. Zum Beispieldf1.merge(right=df2, ...)
ist äquivalent zupandas.merge(left=df1, right=df2, ...)
.Dies sind die Hauptunterschiede zwischen
df.join()
unddf.merge()
:df1.join(df2)
immer über den Index vondf2
,df1.merge(df2)
kann jedoch mit einer oder mehreren Spalten vondf2
(Standard) oder mit dem Index vondf2
(mitright_index=True
) verknüpft werden.df1.join(df2)
Verwendet standardmäßig den Index vondf1
unddf1.merge(df2)
verwendet die Spalte (n) vondf1
. Dies kann durch Angabe vondf1.join(df2, on=key_or_keys)
oder überschrieben werdendf1.merge(df2, left_index=True)
.df1.join(df2)
Führt standardmäßig einen Left Join durch (behält alle Zeilen von beidf1
), führt jedochdf.merge
standardmäßig einen Inner Join durch (gibt nur übereinstimmende Zeilen vondf1
und zurückdf2
).Der generische Ansatz ist also,
pandas.merge(df1, df2)
oder zu verwendendf1.merge(df2)
. In einigen häufigen Situationen (Beibehalten aller Zeilendf1
und Verknüpfen mit einem Indexdf2
) können Sie jedoch einige Eingaben speichern, indem Siedf1.join(df2)
stattdessen verwenden.Einige Hinweise zu diesen Problemen aus der Dokumentation unter http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging :
...
quelle
on=key_or_keys
die Art und Weise ändern kannst , wie Zeilen in der richtigen Tabelle gefunden werden. Dies ist jedoch nicht der Fall. Dason
Argument ändert die Suche in der linken Tabelle (df1
) von Index zu Spalte (n). Selbst mit diesem Argument wird die richtige Tabelle (df2
) über ihren Index abgeglichen. (Siehe das letzte Beispiel oben.)Ich glaube, das
join()
ist nur eine bequeme Methode. Versuchen Siedf1.merge(df2)
stattdessen, die Ihnen erlaubt , zu spezifizierenleft_on
undright_on
:quelle
Aus dieser Dokumentation
Und :
quelle
Einer der Unterschiede besteht darin,
merge
dass ein neuer Index erstellt wird undjoin
der Index auf der linken Seite beibehalten wird. Es kann eine große Konsequenz für Ihre späteren Transformationen haben, wenn Sie fälschlicherweise annehmen, dass Ihr Index mit nicht geändert wirdmerge
.Beispielsweise:
- -
- -
- -
quelle
on
Parameter hat in beiden Fällen unterschiedliche Bedeutungquelle
Analog zu SQL "Pandas-Zusammenführung ist eine äußere / innere Verbindung und Pandas-Verbindung ist eine natürliche Verbindung". Wenn Sie in Pandas zusammenführen verwenden, möchten Sie daher angeben, welche Art von SQL-Join Sie verwenden möchten. Wenn Sie Pandas-Join verwenden, möchten Sie wirklich eine passende Spaltenbezeichnung haben, um sicherzustellen, dass er verknüpft wird
quelle