Python Pandas só pode comparar objetos de série com rótulos idênticos

Aug 29 2020

Eu tenho três quadros de dados. Aqui está meu código e estou recebendo um erro de valor.
raise ValueError("Can only compare identically-labeled Series objects")

ValueError: só pode comparar objetos Series com rótulos idênticos.

Aqui está o meu código:

df1
df2
df3
for i in df1:                 # for i from df1
     x = df2.loc[df2['col_1'] == i, 'col_2']   #looking for i in col_1 of df2 and getting coresponding value of col_2 as x.
     y = df3.loc[df3['col_1'] == x, 'col_2']   #looking for x in col_1 of df3 and getting coresponding value of col_2 as y

A primeira instrução no forloop é executada corretamente, mas obtém um erro de valor na segunda instrução.

Respostas

2 Valdi_Bo Aug 29 2020 at 16:01

Suponha que seus 3 DataFrames tenham o seguinte conteúdo:

df1:                df2:              df3:
       Aa    Bb       col_1 col_2       col_1 col_2
0  123.15  12.6     0    Aa    Cc     0    Cc    Gg
1  137.53  28.3     1    Bb    Dd     1    Dd    Hh
                    2    Bb    Ee     2    Ee    Jj
                                      3    Ff    Kk

Na primeira volta do seu loop, i contém o nome da primeira coluna em df1 , ou seja, 'Aa' .

Quando você executa x = df2.loc[df2['col_1'] == i, 'col_2'], o resultado é uma série :

0    Cc
Name: col_2, dtype: object

E agora, mesmo que você tente executar df3['col_1'] == x, seu erro ocorre.

Observe que, neste caso, ambos df3 ['col_1'] e x são do tipo Série . Nesse caso:

  • a primeira coisa que o Pandas faz é alinhar as duas séries (no índice),
  • e então compararia cada par de elementos (alinhados).

Mas neste caso:

  • df3 ['col_1'] contém índices de 0 a 3 ,
  • o índice em x contém apenas uma posição - 0 .

Portanto, há falha de alinhamento, que causa essa exceção.

Para lidar com esse problema, altere a linha ofensiva para:

y = df3.loc[df3['col_1'].isin(x), 'col_2']

Agora o Pandas funciona como você pretendia:

  • itera sobre df3 ['col_1'] ,
  • para o elemento atual verifica se seu valor está entre os valores presentes em x ,
  • se for, o valor de col_2 na linha atual é adicionado ao resultado.

Para demonstrar como esse código funciona, preencha-o com algumas impressões:

for i in df1:
    print(f'\ni: {i}')
    x = df2.loc[df2['col_1'] == i, 'col_2']
    print(f'\nx:\n{x}')
    y = df3.loc[df3['col_1'].isin(x), 'col_2']
    print(f'\ny:\n{y}')

Quando você executa o código acima, em meus dados, o resultado é:

i: Aa

x:
0    Cc
Name: col_2, dtype: object

y:
0    Gg
Name: col_2, dtype: object

i: Bb

x:
1    Dd
2    Ee
Name: col_2, dtype: object

y:
1    Hh
2    Jj
Name: col_2, dtype: object