Panda: unire (unire) due frame di dati su più colonne


169

Sto cercando di unire due frame di dati Panda usando due colonne:

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

ma ho ottenuto il seguente errore:

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]'

Qualche idea su quale dovrebbe essere il modo giusto per farlo? Grazie!


53
left_one right_ondovrebbe essere un elenco di stringhe, non una stringa che assomiglia a un elenco.
radice

Risposte:


313

Prova questo

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: etichetta o elenco o nomi di campi simili a array su cui unirsi nel DataFrame di sinistra. Può essere un vettore o un elenco di vettori della lunghezza di DataFrame per utilizzare un determinato vettore come chiave di join anziché colonne

right_on: etichetta o elenco, o nomi di campi simili a array su cui unirsi nel DataFrame di destra o nel vettore / elenco di vettori per i documenti left_on


8
Se left_one right_onsono uguali ae b, possiamo usare on = ['a', 'b']?
Ahbon,

4
Sì, è perfettamente valido.
user3065757,

4

il problema qui è che usando gli apostrofi si imposta il valore che viene passato come stringa, quando in effetti, come affermato da @Shijo dalla documentazione, la funzione si aspetta un'etichetta o un elenco, ma non una stringa! Se l'elenco contiene ciascuno dei nomi degli esseri delle colonne passati per il frame di dati destro e sinistro, allora ciascun nome di colonna deve essere individualmente all'interno degli apostrofi. Con quanto affermato, possiamo capire perché questo non è corretto:

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

E questo è il modo corretto di usare la funzione:

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

3

Un altro modo per farlo: new_df = A_df.merge(B_df, left_on=['A_c1','c2'], right_on = ['B_c1','c2'], how='left')

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.