Unterschied (e) zwischen merge () und concat () bei Pandas


88

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.)


3
Auch im Zusammenhang: stackoverflow.com/a/37891437/1972495 eine Diskussion um .merge()und .join().
WindChimes

2
Beim Zusammenführen, Verbinden und Concat finde ich, dass diese Antwort sehr klar ist, wie sie alle verwendet werden können, um dasselbe zu tun (sie scheinen nur eine alternative Schnittstelle zu derselben Funktionalität zu sein). Dank Ihrer Frage (und der Antwort, die Sie im Kommentar verlinken) weiß ich endlich, wie Zusammenführen und Verbinden zusammenhängen. Mir ist immer noch unklar, ob concat eine andere Implementierung verwendet oder nicht (ich denke, ich muss mir den Quellcode ansehen ...)
Pietroppeter

Antworten:


79

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, verwendet left_index=Trueund / oder verwendet werden right_index=True) und concat()ein (oder mehrere) Datenrahmen an einen angehängt werden untereinander (oder seitwärts, je nachdem, ob die axisOption auf 0 oder 1 gesetzt ist).

join()wird verwendet, um 2 Datenrahmen auf der Basis des Index zusammenzuführen; anstatt merge()mit der Option zu verwenden, die left_index=Truewir verwenden können join().

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

Das bedeutet also, dass das Argument howin mergefunktioniert und völlig anders bedeutet als das, was es tut concat?
Hemanth Bakaya

11

pd.concatnimmt ein Iterableals Argument. Daher kann es nicht DataFramedirekt s als Argument nehmen. Auch Dimensions der DataFramesollten während der Verkettung entlang der Achse übereinstimmen.

pd.mergekann DataFrames als Argument nehmen und wird verwendet, um zwei DataFrames mit denselben Spalten oder demselben Index zu kombinieren , was nicht möglich ist, pd.concatda die wiederholte Spalte im DataFrame angezeigt wird.

Während Join verwendet werden kann, um zwei DataFrames mit unterschiedlichen Indizes zu verbinden.


7
Ich mag diese Antwort, weil sie besagt, dass die Dimensionen beim Verketten übereinstimmen sollten. concatist nichts anderes als mehrere Datenrahmen übereinander zu kleben. Es ist nicht inhaltsbewusst in dem Sinne, dass es nur zweimal dieselbe Spalte anzeigt. Während mergetatsächlich verschmelzen Spalten , wenn sie gleich sind.
Jorijnsmit

2
Ich denke es ist nicht wahr. Selbst die obige Antwort (von @Abhishek Sawant) gibt ein Beispiel dafür, concatwo die Abmessungen nicht übereinstimmen.
michcio1234

7

Ich versuche gerade, die wesentlichen Unterschiede zwischen pd.DataFrame.merge()und zu verstehen pd.concat().

Gute Frage. Der Hauptunterschied:

pd.concat funktioniert auf beiden Achsen.

Der andere Unterschied ist pd.concathat inneren Standard und äußerte Joins nur, während pd.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, obwohl pd.concatdies nicht möglich ist.


Mit pd.concatstandardmäßig sind Sie in der Lage Reihen von mehreren Datenrahmen zu stapeln ( axis=0) und wenn Sie den Satz axis=1dann imitieren Sie die pd.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

5

Auf hohem Niveau:

  • .concat()Stapeln Sie einfach mehrere DataFrameentweder vertikal oder horizontal nach dem Ausrichten auf dem Index
  • .merge()Richtet zuerst zwei DataFrameausgewählte gemeinsame Spalten oder Indizes aus und nimmt dann die verbleibenden Spalten aus den jeweils ausgerichteten Zeilen auf DataFrame.

Genauer gesagt .concat():

  • Ist eine Pandas-Funktion der obersten Ebene
  • Kombiniert zwei oder mehr Pandas DataFrame vertikal oder horizontal
  • Wird beim horizontalen Kombinieren nur am Index ausgerichtet
  • Fehler, wenn einer der DataFramebeiden einen doppelten Index enthält.
  • Der Standardwert ist der äußere Join mit der Option für den inneren Join

Und .merge():

  • Existiert sowohl als Pandas-Funktion der obersten Ebene als auch als DataFrameMethode (ab Pandas 1.0)
  • Kombiniert genau zwei DataFramehorizontal
  • Richtet die Berufung DataFrame‚s Spalte (n) oder einen Index mit der anderen DataFrame‘ s Spalte (n) oder Index
  • Behandelt doppelte Werte in den Verbindungsspalten oder im Index, indem ein kartesisches Produkt ausgeführt wird
  • Standardmäßig wird die innere Verknüpfung mit Optionen für links, außen und rechts verwendet

Beachten Sie, dass bei der Ausführung pd.merge(left, right), wenn leftzwei Zeilen dieselben Werte aus den Verbindungsspalten oder dem Index enthalten, jede Zeile mit rightden 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 ist DataFrame.

Praktisch gesprochen:

  • Berücksichtigen Sie .concat()zuerst, wenn Sie homogen kombinieren DataFrame, und .merge()zuerst, wenn Sie komplementär kombinieren DataFrame.
  • Wenn Sie vertikal zusammenführen müssen, gehen Sie mit .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


2

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.mergewird 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

  • rechts : DataFrame oder benannte Serie

Optionale Parameter

  • wie : {'links', 'rechts', 'außen', 'inner'} Standard 'inner'
  • on : Label oder Liste
  • left_on : label oder list oder array-like
  • right_on : label oder list oder array-like
  • left_index : bool, Standardwert False
  • right_index : bool, Standardwert False
  • sort : bool, default False
  • Suffixe : Tupel von (str, str), Standard ('_x', '_y')
  • copy : bool, default True
  • Indikator : bool oder str, Standard False
  • validieren : str, optional

Wichtig: pd.DataFrame.merge Erfordert das Recht, ein pd.DataFrameoder ein benanntes pd.SeriesObjekt zu sein.

Ausgabe

  • Rückgabe : Datenrahmen

Wenn wir außerdem die Dokumentzeichenfolge für Zusammenführungsvorgänge bei Pandas überprüfen, sehen Sie Folgendes:

Führen Sie eine Datenbank-Zusammenführungsoperation (SQL) zwischen zwei DataFrame- oder Series-Objekten durch, indem Sie entweder Spalten als Schlüssel oder deren Zeilenindizes verwenden

Concat

Beachten Sie in der Dokumentation von pd.concatzunä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

  • objs : eine Sequenz oder Zuordnung von Serien- oder DataFrame-Objekten

Optionale Parameter

  • Achse : {0 / 'Index', 1 / 'Spalten'}, Standard 0
  • join : {'inner', 'äußere'}, Standard 'äußere'
  • ignore_index : bool, Standardwert False
  • Tasten : Sequenz, Standard Keine
  • Ebenen : Liste der Sequenzen, Standard Keine
  • Namen : Liste, Standard Keine
  • verify_integrity : bool, Standardwert False
  • sort : bool, default False
  • copy : bool, default True

Ausgabe

  • Returns : Objekt, Art der objs

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.SeriesObjekts) 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.


0

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.


-2

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.