Was ist der wesentliche Unterschied zwischen pd.DataFrame.merge()
und pd.concat()
?
Bisher habe ich Folgendes gefunden. Bitte kommentieren Sie, wie vollständig und genau mein Verständnis ist:
.merge()
kann nur Spalten (plus Zeilenindizes) verwenden und ist semantisch für Operationen im Datenbankstil geeignet..concat()
kann mit beiden Achsen verwendet werden, wobei nur Indizes verwendet werden, und bietet die Möglichkeit, einen hierarchischen Index hinzuzufügen.Dies ermöglicht übrigens folgende Redundanz: Beide können zwei Datenrahmen unter Verwendung der Zeilenindizes kombinieren.
pd.DataFrame.join()
bietet lediglich eine Abkürzung für eine Teilmenge der Anwendungsfälle von.merge()
(Pandas eignet sich hervorragend für ein sehr breites Spektrum von Anwendungsfällen in der Datenanalyse. Es kann etwas entmutigend sein, die Dokumentation zu durchsuchen, um herauszufinden, wie eine bestimmte Aufgabe am besten ausgeführt werden kann.)
.merge()
und.join()
.Antworten:
Ein sehr hoher Pegelunterschied besteht darin, dass
merge()
zwei (oder mehr) Datenrahmen auf der Grundlage von Werten gemeinsamer Spalten kombiniert werden (Indizes können auch verwendet, verwendetleft_index=True
und / oder verwendet werdenright_index=True
) undconcat()
ein (oder mehrere) Datenrahmen an einen angehängt werden untereinander (oder seitwärts, je nachdem, ob dieaxis
Option auf 0 oder 1 gesetzt ist).join()
wird verwendet, um 2 Datenrahmen auf der Basis des Index zusammenzuführen; anstattmerge()
mit der Option zu verwenden, dieleft_index=True
wir verwenden könnenjoin()
.Zum Beispiel:
df1 = pd.DataFrame({'Key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'], 'data1': range(7)}) df1: Key data1 0 b 0 1 b 1 2 a 2 3 c 3 4 a 4 5 a 5 6 b 6 df2 = pd.DataFrame({'Key': ['a', 'b', 'd'], 'data2': range(3)}) df2: Key data2 0 a 0 1 b 1 2 d 2 #Merge # The 2 dataframes are merged on the basis of values in column "Key" as it is # a common column in 2 dataframes pd.merge(df1, df2) Key data1 data2 0 b 0 1 1 b 1 1 2 b 6 1 3 a 2 0 4 a 4 0 5 a 5 0 #Concat # df2 dataframe is appended at the bottom of df1 pd.concat([df1, df2]) Key data1 data2 0 b 0 NaN 1 b 1 NaN 2 a 2 NaN 3 c 3 NaN 4 a 4 NaN 5 a 5 NaN 6 b 6 NaN 0 a Nan 0 1 b Nan 1 2 d Nan 2
quelle
how
inmerge
funktioniert und völlig anders bedeutet als das, was es tutconcat
?pd.concat
nimmt einIterable
als Argument. Daher kann es nichtDataFrame
direkt s als Argument nehmen. AuchDimension
s derDataFrame
sollten während der Verkettung entlang der Achse übereinstimmen.pd.merge
kannDataFrame
s als Argument nehmen und wird verwendet, um zweiDataFrame
s mit denselben Spalten oder demselben Index zu kombinieren , was nicht möglich ist,pd.concat
da die wiederholte Spalte im DataFrame angezeigt wird.Während Join verwendet werden kann, um zwei
DataFrame
s mit unterschiedlichen Indizes zu verbinden.quelle
concat
ist nichts anderes als mehrere Datenrahmen übereinander zu kleben. Es ist nicht inhaltsbewusst in dem Sinne, dass es nur zweimal dieselbe Spalte anzeigt. Währendmerge
tatsächlich verschmelzen Spalten , wenn sie gleich sind.concat
wo die Abmessungen nicht übereinstimmen.Gute Frage. Der Hauptunterschied:
pd.concat
funktioniert auf beiden Achsen.Der andere Unterschied ist
pd.concat
hat inneren Standard und äußerte Joins nur, währendpd.DataFrame.merge()
hat links , rechts , äußerte , innerer Standard verbindet.Der dritte bemerkenswerte andere Unterschied ist:
pd.DataFrame.merge()
hat die Option, die Spalten-Suffixe festzulegen, wenn Spalten mit demselben Namen zusammengeführt werden, obwohlpd.concat
dies nicht möglich ist.Mit
pd.concat
standardmäßig sind Sie in der Lage Reihen von mehreren Datenrahmen zu stapeln (axis=0
) und wenn Sie den Satzaxis=1
dann imitieren Sie diepd.DataFrame.merge()
Funktion.Einige nützliche Beispiele für
pd.concat
:df2=pd.concat([df]*2, ignore_index=True) #double the rows of a dataframe df2=pd.concat([df, df.iloc[[0]]]) # add first row to the end df3=pd.concat([df1,df2], join='inner', ignore_index=True) # concat two df's
quelle
Auf hohem Niveau:
.concat()
Stapeln Sie einfach mehrereDataFrame
entweder vertikal oder horizontal nach dem Ausrichten auf dem Index.merge()
Richtet zuerst zweiDataFrame
ausgewählte gemeinsame Spalten oder Indizes aus und nimmt dann die verbleibenden Spalten aus den jeweils ausgerichteten Zeilen aufDataFrame
.Genauer gesagt
.concat()
:DataFrame
vertikal oder horizontalDataFrame
beiden einen doppelten Index enthält.Und
.merge()
:DataFrame
Methode (ab Pandas 1.0)DataFrame
horizontalDataFrame
‚s Spalte (n) oder einen Index mit der anderenDataFrame
‘ s Spalte (n) oder IndexBeachten Sie, dass bei der Ausführung
pd.merge(left, right)
, wennleft
zwei Zeilen dieselben Werte aus den Verbindungsspalten oder dem Index enthalten, jede Zeile mitright
den entsprechenden Zeilen kombiniert wird, was zu einem kartesischen Produkt führt. Wenn andererseits.concat()
Spalten kombiniert werden sollen, müssen wir sicherstellen, dass in beiden auch kein doppelter Index vorhanden istDataFrame
.Praktisch gesprochen:
.concat()
zuerst, wenn Sie homogen kombinierenDataFrame
, und.merge()
zuerst, wenn Sie komplementär kombinierenDataFrame
..concat()
. Wenn Sie horizontal über Spalten zusammenführen müssen, gehen Sie zu.merge()
, die standardmäßig auf den gemeinsamen Spalten zusammengeführt werden.Referenz: Pandas 1.x Kochbuch
quelle
Der Hauptunterschied zwischen Merge & Concat besteht darin, dass Sie durch Merge eine strukturiertere "Verknüpfung" von Tabellen durchführen können, bei denen die Verwendung von Concat breiter und weniger strukturiert ist.
Verschmelzen
Wenn Sie auf die Dokumentation verweisen ,
pd.DataFrame.merge
wird rechts als erforderliches Argument verwendet, das Sie als Verknüpfung der linken und rechten Tabelle gemäß einer vordefinierten strukturierten Verknüpfungsoperation betrachten können. Beachten Sie die Definition für Parameter rechts .Erforderliche Parameter
Optionale Parameter
Wichtig:
pd.DataFrame.merge
Erfordert das Recht, einpd.DataFrame
oder ein benanntespd.Series
Objekt zu sein.Ausgabe
Wenn wir außerdem die Dokumentzeichenfolge für Zusammenführungsvorgänge bei Pandas überprüfen, sehen Sie Folgendes:
Concat
Beachten Sie in der Dokumentation von
pd.concat
zunächst, dass der Parameter nicht als Tabelle, Datenrahmen, Serie, Matrix usw. bezeichnet wird, sondern als objs . Das heißt, Sie können viele "Datencontainer" übergeben, die wie folgt definiert sind:Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]
Erforderliche Parameter
Optionale Parameter
Ausgabe
Beispiel
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)
Code-Ausgabe
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
Sie können jedoch die ersten Ausgang (merge) mit concat durch Ändern des erreichen Achse Parameter
concat_result = pd.concat([df_left, df_right], sort=False, axis=1)
Beachten Sie das folgende Verhalten:
concat_result = pd.concat([df_left, df_right, df_left, df_right], sort=False)
Ausgänge;
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
Dies können Sie beim Zusammenführen nicht mit einem ähnlichen Vorgang ausführen, da nur ein einzelner DataFrame oder eine benannte Serie zulässig ist.
merge_result = df_left.merge([df_right, df_left, df_right], left_index=True, right_index=True)
Ausgänge;
TypeError: Can only merge Series or DataFrame objects, a <class 'list'> was passed
Fazit
Wie Sie vielleicht bereits bemerkt haben, können sich die Ein- und Ausgänge zwischen "Zusammenführen" und "Concat" unterscheiden.
Wie eingangs erwähnt, besteht der allererste (Haupt-) Unterschied darin, dass "Zusammenführen" eine strukturiertere Verknüpfung mit einer Reihe eingeschränkter Objekte und Parameter ausführt, während "concat" eine weniger strenge / breitere Verknüpfung mit einer breiteren Gruppe ausführt von Objekten und Parametern.
Alles in allem ist das Zusammenführen weniger tolerant gegenüber Änderungen / (der Eingabe) und "concat" ist lockerer / weniger empfindlich gegenüber Änderungen / (der Eingabe). Sie können "Zusammenführen" erreichen, indem Sie "concat" verwenden, aber das Gegenteil ist nicht immer der Fall.
Bei der Operation "Zusammenführen" werden Datenrahmenspalten (oder der Name des
pd.Series
Objekts) oder Zeilenindizes verwendet. Da nur diese Entitäten verwendet werden, wird die horizontale Zusammenführung von Datenrahmen oder Serien durchgeführt, und es wird keine vertikale Operation angewendet.Wenn Sie mehr sehen möchten, können Sie ein wenig in den Quellcode eintauchen.
quelle
Nur die Concat-Funktion hat einen Achsenparameter. Zusammenführen wird verwendet, um Datenrahmen basierend auf Werten in gemeinsam genutzten Spalten nebeneinander zu kombinieren, sodass keine Achsenparameter erforderlich sind.
quelle
Standardmäßig:
join ist eine spaltenweise linke Verknüpfung.
pd.merge ist eine spaltenweise innere Verknüpfung.
pd.concat ist eine zeilenweise äußere Verknüpfung
pd.concat:
Nimmt iterierbare Argumente an. Daher können DataFrames nicht direkt verwendet werden (verwenden Sie [df, df2]). Die
Abmessungen von DataFrame sollten entlang der Achse übereinstimmen
Join und pd.merge:
können DataFrame-Argumente annehmen
Klicken Sie hier, um das Bild zu sehen, um zu verstehen, warum der folgende Code dasselbe tut
df1.join(df2) pd.merge(df1, df2, left_index=True, right_index=True) pd.concat([df1, df2], axis=1)
quelle