10
respostas

Comparar dados de uma coluna de dataframe

Pessoal, estou fazendo um trabalho de treinamento onde preciso comparar uma planilha de numeros de cupons de uma coluna e de outra, mas não achei nenhuma solução.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Oque preciso é olhar o primeiro dataframe e comparar com o segundo para saber quais itens se encontram nas duas tabelas.

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeexemplo do arquivo importado:

10 respostas

Olá Breno,

O que você está querendo realizar é um INNER JOIN, quando você quer filtrar aparições em comum nas duas tabelas.

Para fazer isso no pandas, existe o método join(), mas ele junta as tabelas a partir do index, então, os valores que você procura em ambas tabelas devem ser transformados em index:

df1 = df1.set_index("SOCIN")
df2 = df2.set_index("RMS")

Então se realiza o método join() utilizando o INNER JOIN:

juncao = df1.join(df2, how="inner")

A tabela resultante juntou os dados que aparecem em ambas tabelas, porém, é um DataFrame com apenas um index, o que não é muito apresentável, para formatar esta tabela:

juncao = juncao.reset_index() # Gerou a coluna com o resultado e reiniciou o index

# A coluna com o resultado ficou com o nome "index", renomeie com o nome de coluna desejável
juncao = juncao.rename(columns={"index": "resultado"})

Pronto, agora você realizou o join() e formatou a tabela para a deixar mais apresentável. Espero ter ajudado!

Bom dia Lucas, otimo, realmente uni as tabelas. mas como posso saber quais valores tinha em uma que não tinha na outra ?

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Bom dia, amigo!

Pelo que percebi, as colunas podem estar com formatação diferente, pelas imagens, df1 é do tipo int e df2 é do top float

1º Primeiramente eu faria a conversão para evitar problemas.

df1['SOCIN'] = df1['SOCIN'].astype('float')

2º Após convertido, eu faria o teste lógico, para testar se todos os valores em df1 estão em df2, faria dessa maneira:

df1['SOCIN'] == df2['RMS']

O resultado vai ser TRUE OU FALSE

Se o resultado for True, você sabe que realmente todos os valores estão em ambas as colunas. Agora se o resultado for False, você saberá que nem todos os valores estão nas tabelas.

Que existe a divergencia entre uma coluna e outra eu sei, eu preciso identificar quais foram os cupons que se encontram em apenas uma tabela

Beleza, eu estava fazendo os testes aqui e cheguei nessa conclusão:

faz uma seleção, que ele vai mostrar os valores que não são iguais:

1º Faz novamente os testes lógicos e atribui uma variável a isso

teste = df1['SOCIN'] == df2['RMS']

2º Faz uma seleção dentro do seu dataframe df1 ou df2 escolha o inverso (~), o rsultado tem que ser os valores que não estão em df1 ou vice versa

df1[~ teste]

Keven, me desculpe o abuso. mas essa solução ainda não resolve o problema. Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Observe na tabela a cima, o cupom 26308 não existe na segunda coluna somente na primeira, e existem mais outros cupons que existem em uma coluna e na outra não. que preciso fazer é percorrer as duas tabelas e identificar os itens que são iguais em uma e na outra.

a solução de apenas comparar as duas colunas não funciona por que quando falta um cupom em uma coluna todos os proximos cupons não vão está no mesmo indice da outra coluna. como mostrado em imagem.

e essa solução que me passou busca apenas o cupons que estão iguais comparados com o do seu lado.

Tudo bem, Breno, estou aqui para ajudar se possível.

Teria como tu me enviar esse xlsx por algum link??

Ai tento o resultado aqui, quando eu encontrar uma solução respondo por aqui.

Cara, achei que não ia consegui, mas achei uma solução por aqui, fiz umas perguntas na internet e achei essa solução:

Vamos utilizar o método isin() do português seria "está em". Esse método supera aquele o qual eu mostrei anteriormente, pois realmente o anterior leva em consideração o índice. Esse novo que estou apresentando percorre internamente e compara os valores que estão dentro das colunas.

1º Vamos fazer isso para df1 depois para df2:

# Importar o pandas para manipulação de dataframes
import pandas as pd

atribui o excel p/ Dataframe com nome de 'df'
df = pd.read_excel('comparar.xlsx')

# Cria dois dataframes com nome de: df1 e df2
df1 = df[['SOCIN']]
df2 = df[['RMS']]

2º Vamos selecionar os valores que existem em DF1 e que estão em DF2, e depois, os que existem em DF2 e estão em DF1, vamos fazer isso com o método do pandas isin(). Vamos fazer como o código abaixo:

#aqui começa o código de nosso interesse:
# Vamos fazer uma seleção novamente atribuindo uma variável a ela.

# esse código retorna uma lista boleana, dos valores que de DF1 que existem em DF2: true se existir ou false se não existir
existem_em_df1 = df1['SOCIN'].isin(df2['RMS']) 
existem_em_df2 =df2['RMS'].isin(df1['SOCIN'])

3º Vamos ver os valores que existem em df1 e que não existem em df2, para esse tipo de seleção, vamos usar o operador de negação do python. Ele tem o símbolo ~. Como já sabemos os valores que existem, colocando o operador de negação em frente, obteremos os valores que não existem:

nao_existem_em_df1 = ~existem_em_df1
nao_existem_em_df2 = ~existem_em_df2

4º Nossa seleção está pronta, agora basta chamar os dataframes DF1 e DF2 para sabermos quem existe ou quem não existe. Segue o código abaixo:

# obtem os valores que existem no em ambos os Dataframes (df1 e df2):
df1 = df1[existem_em_df1] #retorna os valores que existem em df1 e existem em df2
df2 = df2[existem_em_df2] #retorna os valores que existem em df2 e existem em df1

df1_ = df1[nao_existem_em_df1]  #retorna os valores que estão em DF1, mas não estão em DF2
df2_ = df2[nao_existem_em_df2] #retorna os valores que estão em DF2, mas não estão em DF1

Pelos testes que realizei, são 4 números que não estão em uma das colunas.

2 na coluna RMS e 2 na coluna SOCIN.

Amigo, espero ter ajudado!!!!

Fantastico, funcionou perfeitamente !! muito obrigado cara.