Problème de jointure des pandas: les colonnes se chevauchent mais aucun suffixe n'est spécifié


136

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

Lorsque j'essaye de rejoindre ces 2 dataframes:

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

J'obtiens l'erreur:

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

Pourquoi cela est-il ainsi? Les dataframes ont des valeurs «mukey» communes.

Réponses:


145

Votre erreur sur l'extrait de données que vous avez publié est un peu énigmatique, en ce sens qu'il n'y a pas de valeurs communes, l'opération de jointure échoue car les valeurs ne se chevauchent pas, vous devez 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

32

La .join()fonction utilise le indexde l'ensemble de données passé comme argument, vous devez donc utiliser set_indexou utiliser la .mergefonction à la place.

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

27

Cette erreur indique que les deux tables ont le ou plusieurs noms de colonne qui ont le même nom de colonne. 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 renommer non plus avant d'en importer un"

Vous voulez soit supprimer l'une des colonnes avant de la transférer de l'autre en utilisant del df ['nom de la colonne'], soit utiliser lsuffix pour réécrire la colonne d'origine, ou rsuffix pour renommer celle qui l'a amenée.

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

1

La jointure est principalement utilisée pour la jointure basée sur l'index, pas sur les noms d'attribut, alors changez les noms d'attributs dans deux dataframes différentes, puis essayez de rejoindre, elles seront jointes, sinon cette erreur est générée

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.