Problema de junção do Pandas: colunas se sobrepõem, mas nenhum sufixo especificado


136

Eu tenho os seguintes 2 quadros de dados:

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 tento ingressar nesses 2 quadros de dados:

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

Eu recebo o erro:

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

Porque isto é assim? Os quadros de dados têm valores comuns 'mukey'.

Respostas:


145

Seu erro no snippet de dados que você postou é um pouco enigmático, pois, como não existem valores comuns, a operação de junção falha porque os valores não se sobrepõem, exigindo que você forneça um sufixo para os lados esquerdo e direito:

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 funciona porque não possui esta restrição:

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

A .join()função está usando o indexconjunto de dados passado como argumento, portanto, você deve usar set_indexou usar a .mergefunção.

Por favor, encontre os dois exemplos que devem funcionar no seu caso:

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

Este erro indica que as duas tabelas têm os 1 ou mais nomes de colunas que têm o mesmo nome de coluna. A mensagem de erro se traduz em: "Eu posso ver a mesma coluna nas duas tabelas, mas você não me pediu para renomear antes de trazer uma delas"

Você deseja excluir uma das colunas antes de trazê-la da outra, usando del df ['nome da coluna'], ou use lsuffix para reescrever a coluna original ou rsuffix para renomear a que está sendo trazida.

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

1

Principalmente, a junção é usada exclusivamente para ingressar com base no índice, não nos nomes dos atributos; portanto, altere os nomes dos atributos em dois quadros de dados diferentes e tente ingressar, eles serão ingressados, caso contrário, esse erro será gerado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.