web-dev-qa-db-fra.com

Pandas problème de jointure: les colonnes se chevauchent mais aucun suffixe n'est spécifié

J'ai 2 trames de données suivantes:

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

Quand j'essaye de joindre ces 2 cadres de données:

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

Je reçois l'erreur:

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

Pourquoi cela est-il ainsi? Les cadres de données ont des valeurs communes de "mukey".

102
user308827

Votre erreur sur l'extrait de données que vous avez posté est un peu cryptique. En effet, comme il n'y a pas de valeurs communes, l'opération de jointure échoue car les valeurs ne se chevauchent pas. Vous devez donc fournir un suffixe pour les côtés gauche et droit:

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 fonctionne car il n'a pas cette restriction:

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
105
EdChum

La fonction .join() utilise la index du jeu de données d'argument transmis. Vous devez donc utiliser set_index ou utiliser la fonction .merge.

Veuillez trouver les deux exemples qui devraient fonctionner dans votre cas:

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

ou

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

19
Velizar VESSELINOV

Cette erreur indique que les deux tables ont le ou les noms de colonne portant le même nom. Le message d'erreur se traduit par: "Je peux voir la même colonne dans les deux tableaux, mais vous ne m'avez pas dit de le renommer non plus avant d'en importer un"

Soit vous voulez supprimer une des colonnes avant de la faire venir de l'autre en utilisant del df ['nom de la colonne'], soit vous utilisez lsuffix pour réécrire la colonne d'origine, ou bien rsuffix pour renommer celle qui l'a importée.

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