Python Pandas führen nur bestimmte Spalten zusammen

109

Ist es möglich, nur einige Spalten zusammenzuführen? Ich habe einen DataFrame df1 mit den Spalten x, y, z und df2 mit den Spalten x, a, b, c, d, e, f usw.

Ich möchte die beiden DataFrames auf x zusammenführen, aber ich möchte nur die Spalten df2.a, df2.b zusammenführen - nicht den gesamten DataFrame.

Das Ergebnis wäre ein DataFrame mit x, y, z, a, b.

Ich könnte die unerwünschten Spalten zusammenführen und dann löschen, aber es scheint, als gäbe es eine bessere Methode.

BubbleGuppies
quelle
1
Andy: Heilige Kuh, das war einfach ... Ich brauche eine Pause, ich mache das offensichtlich zu kompliziert. Danke für die Klarheit!
BubbleGuppies

Antworten:

81

Sie können den Sub-DataFrame (nur mit diesen Spalten) zusammenführen:

df2[list('xab')]  # df2 but only with columns x, a, and b

df1.merge(df2[list('xab')])
Andy Hayden
quelle
6
Hmmm, ich frage mich, ob es einen nativen Weg geben sollte, dies zu tun, wie eine Teilmenge in Dropna ... wird das Github-Problem zusammenstellen
Andy Hayden
Hmmm ... Ich habe versucht, damit die Spalte 'Unique_External_Users' von df2 zu df1 zusammenzuführen, habe aber einen Fehler erhalten ... "Keiner von [Index (['U', 'n', 'i', 'q', 'u ',' e ',' ',' E ',' x ',' t ',' e ',' r ',' n ',' a ', \ n' l ',' ',' U ', 's', 'e', ​​'r', 's'], \ n dtype = 'object')] befinden sich in den [Spalten] ".
CoolDocMan
Hier ist der Code. ... df1.merge (df2 ('Unique_External_Users')])
CoolDocMan
1
@CoolDocMan Ich denke, Sie haben etwas von der vorgeschlagenen Antwort verpasst: list('xab')Nimmt jedes Element (Buchstaben) der Zeichenfolge 'xab' und konvertiert es in ein Listenelement, sodass es list('xab')zurückkehrt ['x', 'a', 'b']. Das funktioniert, wenn jede Spalte einen einzelnen Buchstaben als Namen hat. In Ihrem Fall müssen Sie df1.merge ausführen (df2 ['Unique_External_Users'], * other_arguments). ... Höchstwahrscheinlich haben Sie es bereits gelöst und dies nur Neulingen wie mir
überlassen
114

Sie möchten ZWEI Klammern verwenden. Wenn Sie also eine VLOOKUP-Aktion ausführen:

df = pd.merge(df,df2[['Key_Column','Target_Column']],on='Key_Column', how='left')

Dadurch erhalten Sie alles im ursprünglichen df + und fügen die entsprechende Spalte in df2 hinzu, der Sie beitreten möchten.

Arthur D. Howland
quelle
11

Wenn Sie Spalten aus dem Zieldatenrahmen löschen möchten, die Spalten jedoch für den Join erforderlich sind, können Sie Folgendes tun:

df1 = df1.merge(df2[['a', 'b', 'key1']], how = 'left',
                left_on = 'key2', right_on = 'key1').drop('key1')

Das .drop('key1')Teil verhindert, dass 'key1' im resultierenden Datenrahmen beibehalten wird, obwohl es zunächst erforderlich ist, sich anzuschließen.

Tonneofash
quelle
3
Ich erhalte die folgende Fehlermeldung, wenn ich dies versuche:KeyError: "['key1'] not found in axis"
Tanya Branagan
2
versuchen Sie .drop (Spalten = ['key1'])
Psangam
Oder .drop ('key1', Achse = 1)
Tonneofash
8

Sie können verwenden .loc, um die spezifischen Spalten mit allen Zeilen auszuwählen und diese dann abzurufen. Ein Beispiel ist unten:

pandas.merge(dataframe1, dataframe2.iloc[:, [0:5]], how='left', on='key')

In diesem Beispiel führen Sie Datenrahmen1 und Datenrahmen2 zusammen. Sie haben sich für eine äußere linke Verknüpfung mit 'Schlüssel' entschieden. Für dataframe2 haben Sie jedoch angegeben .iloc, dass Sie die gewünschten Zeilen und Spalten in einem numerischen Format angeben können. Mit :können Sie alle Zeilen auswählen, aber [0:5]die ersten 5 Spalten auswählen . Sie können verwenden .loc, um nach Namen anzugeben, aber wenn Sie mit langen Spaltennamen arbeiten, ist dies .ilocmöglicherweise besser.

Terrance DeJesus
quelle
1
Beachten Sie, .locdass dadurch eine Kopie erstellt wird , und auf einem großen df kann dies schmerzhaft sein. Es ist möglicherweise besser, zusammenzuführen, als sofort einen Spaltenabschnitt im selben Ausdruck zu erstellen.
smci
7

Hiermit werden ausgewählte Spalten aus zwei Tabellen zusammengeführt.

Wenn table_1enthält t1_a,t1_b,t1_c..,id,..t1_zSpalten und table_2enthält t2_a, t2_b, t2_c..., id,..t2_zSpalten, und nur t1_a, id, t2_a ist in dem Finaltisch erforderlich, dann

mergedCSV = table_1[['t1_a','id']].merge(table_2[['t2_a','id']], on = 'id',how = 'left')
# save resulting output file    
mergedCSV.to_csv('output.csv',index = False)
Marco167
quelle