Pandas: Zusammenführen (Verbinden) von zwei Datenrahmen in mehreren Spalten

168

Ich versuche, zwei Pandas-Datenrahmen mit zwei Spalten zu verbinden:

new_df = pd.merge(A_df, B_df,  how='left', left_on='[A_c1,c2]', right_on = '[B_c1,c2]')

habe aber folgenden Fehler bekommen:

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4164)()

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4028)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13166)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13120)()

KeyError: '[B_1, c2]'

Irgendeine Idee, was der richtige Weg sein sollte, dies zu tun? Vielen Dank!

Edamame
quelle
52
left_onund right_onsollte eine Liste von Zeichenfolgen sein, keine Zeichenfolge, die wie eine Liste aussieht.
Wurzel

Antworten:

311

Versuche dies

new_df = pd.merge(A_df, B_df,  how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2'])

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html

left_on: Bezeichnung oder Liste oder Array-ähnliche Feldnamen, die im linken DataFrame verknüpft werden sollen. Kann ein Vektor oder eine Liste von Vektoren mit der Länge des DataFrame sein, um anstelle von Spalten einen bestimmten Vektor als Verknüpfungsschlüssel zu verwenden

right_on: Bezeichnung oder Liste oder Array-ähnliche Feldnamen, die in den rechten DataFrame oder den Vektor / die Liste der Vektoren pro left_on-Dokument eingefügt werden sollen

Shijo
quelle
8
Wenn left_onund right_onsind gleich aund bkönnen wir verwenden on = ['a', 'b']?
Ahbon
4
Ja das ist vollkommen gültig.
user3065757
4

Das Problem hierbei ist, dass Sie mithilfe der Apostrophe den übergebenen Wert als Zeichenfolge festlegen, obwohl die Funktion, wie in der Dokumentation angegeben, eine Bezeichnung oder Liste erwartet, jedoch keine Zeichenfolge! Wenn die Liste jeden Namen der Spalten enthält, die sowohl für den linken als auch für den rechten Datenrahmen übergeben wurden, muss sich jeder Spaltenname einzeln in Apostrophen befinden. Mit dem, was gesagt wurde, können wir verstehen, warum dies falsch ist:

new_df = pd.merge(A_df, B_df,  how='left', left_on='[A_c1,c2]', right_on = '[B_c1,c2]')

Und das ist die richtige Art, die Funktion zu nutzen:

new_df = pd.merge(A_df, B_df,  how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2'])
Celius Stingher
quelle
3

Ein anderer Weg, dies zu tun: new_df = A_df.merge(B_df, left_on=['A_c1','c2'], right_on = ['B_c1','c2'], how='left')

John Ed
quelle