Problema di join Panda: le colonne si sovrappongono ma non è stato specificato alcun suffisso


136

Ho i seguenti 2 frame di dati:

df_a =

     mukey  DI  PI
0   100000  35  14
1  1000005  44  14
2  1000006  44  14
3  1000007  43  13
4  1000008  43  13

df_b = 
    mukey  niccdcd
0  190236        4
1  190237        6
2  190238        7
3  190239        4
4  190240        7

Quando provo a unirmi a questi 2 frame di dati:

join_df = df_a.join(df_b,on='mukey',how='left')

Ottengo l'errore:

*** ValueError: columns overlap but no suffix specified: Index([u'mukey'], dtype='object')

Perché è così? I frame di dati hanno valori 'mukey' comuni.

Risposte:


145

Il tuo errore sullo snippet di dati che hai pubblicato è un po 'enigmatico, dal momento che poiché non ci sono valori comuni, l'operazione di join fallisce perché i valori non si sovrappongono richiede che tu fornisca un suffisso per il lato sinistro e destro:

In [173]:

df_a.join(df_b, on='mukey', how='left', lsuffix='_left', rsuffix='_right')
Out[173]:
       mukey_left  DI  PI  mukey_right  niccdcd
index                                          
0          100000  35  14          NaN      NaN
1         1000005  44  14          NaN      NaN
2         1000006  44  14          NaN      NaN
3         1000007  43  13          NaN      NaN
4         1000008  43  13          NaN      NaN

merge funziona perché non ha questa limitazione:

In [176]:

df_a.merge(df_b, on='mukey', how='left')
Out[176]:
     mukey  DI  PI  niccdcd
0   100000  35  14      NaN
1  1000005  44  14      NaN
2  1000006  44  14      NaN
3  1000007  43  13      NaN
4  1000008  43  13      NaN

32

La .join()funzione sta usando il indexset di dati passato come argomento, quindi dovresti usare set_indexo usare .mergeinvece la funzione.

Trova i due esempi che dovrebbero funzionare nel tuo caso:

join_df = LS_sgo.join(MSU_pi.set_index('mukey'), on='mukey', how='left')

o

join_df = df_a.merge(df_b, on='mukey', how='left')

27

Questo errore indica che le due tabelle hanno 1 o più nomi di colonna con lo stesso nome di colonna. Il messaggio di errore si traduce in: "Riesco a vedere la stessa colonna in entrambe le tabelle ma non mi hai detto di rinominare neanche prima di portarne uno in"

Volete cancellare una delle colonne prima di portarla dall'altra usando del df ['nome colonna'], o usare lsuffix per riscrivere la colonna originale, o rsuffix per rinominare quella che la sta portando.

df_a.join(df_b, on='mukey', how='left', lsuffix='_left', rsuffix='_right')

1

Principalmente join viene utilizzato esclusivamente per unire in base all'indice, non ai nomi degli attributi, quindi modificare i nomi degli attributi in due diversi frame di dati, quindi provare a unirsi, verranno uniti, altrimenti viene generato questo errore

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.