I panda Python uniscono solo alcune colonne


109

È possibile unire solo alcune colonne? Ho un DataFrame df1 con colonne x, y, z e df2 con colonne x, a, b, c, d, e, f, ecc.

Voglio unire i due DataFrame su x, ma voglio solo unire le colonne df2.a, df2.b - non l'intero DataFrame.

Il risultato sarebbe un DataFrame con x, y, z, a, b.

Potrei unire quindi eliminare le colonne indesiderate, ma sembra che ci sia un metodo migliore.


1
Andy: Holy cow è stato facile ... ho bisogno di una pausa, ovviamente lo sto rendendo troppo complicato. Grazie per la chiarezza!
BubbleGuppies

Risposte:


81

Puoi unire il sub-DataFrame (solo con quelle colonne):

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

df1.merge(df2[list('xab')])

6
Hmmm, mi chiedo se dovrebbe esserci un modo nativo per farlo, come il sottoinsieme in dropna ... metterà insieme il problema di GitHub
Andy Hayden

Hmmm ... Ho provato a usarlo per unire la colonna "Unique_External_Users" da df2 a df1 ma ho ricevuto un errore ... "Nessuno di [Index (['U', 'n', 'i', 'q', 'u ',' e ',' ',' E ',' x ',' t ',' e ',' r ',' n ',' a ', \ n' l ',' ',' U ', 's', 'e', ​​'r', 's'], \ n dtype = 'object')] sono nelle [colonne] ".
CoolDocMan

Ecco il codice. ... df1.merge (df2 ('Unique_External_Users')])
CoolDocMan

1
@CoolDocMan Penso che ti sei perso qualcosa dalla risposta proposta: list('xab')prende ogni elemento (lettera) della stringa 'xab' e lo converte in un elemento di lista, quindi list('xab')ritorna ['x', 'a', 'b']. Funziona se ogni colonna ha una singola lettera come nome. Nel tuo caso penso che tu debba fare df1.merge (df2 ['Unique_External_Users'], * other_arguments). ... Molto probabilmente l'hai già risolto, lasciandolo solo ai neofiti in giro, come me
SOf_PUAR

114

Vuoi usare DUE parentesi, quindi se stai eseguendo un tipo di azione CERCA.VERT:

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

Questo ti darà tutto nel df originale + aggiungi quella colonna corrispondente in df2 a cui vuoi unirti.


11

Se desideri eliminare le colonne dal data frame di destinazione, ma le colonne sono necessarie per il join, puoi eseguire le seguenti operazioni:

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

La .drop('key1')parte impedirà che "key1" venga mantenuta nel frame di dati risultante, nonostante sia necessario unirsi in primo luogo.


4
Ottengo il seguente errore se provo questo:KeyError: "['key1'] not found in axis"
Tanya Branagan

3
prova .drop (colonne = ['key1'])
psangam

Oppure .drop ('key1', axis = 1)
tonneofash

8

È possibile utilizzare .locper selezionare le colonne specifiche con tutte le righe e quindi estrarle. Di seguito un esempio:

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

In questo esempio, stai unendo dataframe1 e dataframe2. Hai scelto di fare un join sinistro esterno su "chiave". Tuttavia, per dataframe2 hai specificato .ilocche ti consente di specificare le righe e le colonne desiderate in un formato numerico. Usando :, selezioni tutte le righe, ma [0:5]seleziona le prime 5 colonne. Potresti usare .locper specificare per nome, ma se hai a che fare con nomi di colonne lunghi, .ilocpotrebbe essere meglio.


1
Attenzione che .locne farà una copia , e su un df grande che può essere doloroso. Potrebbe essere meglio unire quindi prendere immediatamente una sezione di colonna nella stessa espressione.
smci

7

Questo serve per unire le colonne selezionate da due tabelle.

Se table_1contiene t1_a,t1_b,t1_c..,id,..t1_zcolonne e table_2contiene t2_a, t2_b, t2_c..., id,..t2_zcolonne e solo t1_a, id, t2_a sono obbligatori nella tabella finale, quindi

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