quarta-feira, 5 de agosto de 2020

Comparando valores ausentes no dataframe pandas

Photo by Ayesh Rathnayake on Unsplash

Os valores ausentes num dataframe pandas são representados com um objeto da biblioteca NumPy NaN (np.nan). Esse objeto é bastante curioso. Por exemplo, o objeto não é igual a ele mesmo. Para comparação o objeto None é igual a ele mesmo, mas não um objeto np.nan. No exemplo abaixo vamos fazer um pequeno teste e comparar os dois objetos com eles mesmos. O objeto np.nan vai retornar False e o None vai retornar True.

>>> import pandas as pd
>>> import numpy as np
>>> np.nan == np.nan
False

>>> None == None
True

Todos os operadores de comparação vão retornar False com exceção de um: o de diferente.

>>> np.nan > np.nan
False
>>> np.nan < np.nan
False
>>> np.nan != np.nan
True

Com esses exemplos percebemos que o objeto np.nan é um objeto singular. Essa propriedade é muito utilizada na biblioteca pandas.
Para verificar se dataframes e séries pandas são iguais é utilizado o operador ==. Esse operador realiza a operação em cada elemento do dataframe ou série. Como resultado dessa operação temos um objeto com as mesmas dimensões dos objetos pais. Nesse tutorial vamos utilizar o operador de igual (==). Muita gente acha que o operador igual e o método equals() fazem a mesma coisa, mas o operador faz coisa diferentes do método equals().

Como comparar valores ausentes do dataframe pandas

Vamos começar com um exemplo para termos uma ideia de como o operador igual funciona. Vamos comparar cada elemento do dataframe com um valor.

>>> import pandas as pd
>>> filmes = pd.read_csv(‘filmes.csv’)
>>> cod_obra = filmes.select_dtypes(include='number')
>>> cod_obra == 7603
      indice  codigo_obra  ano_producao
0      False        False         False
1      False         True         False
2      False        False         False
3      False        False         False
4      False        False         False
...      ...          ...           ...
9257   False        False         False
9258   False        False         False
9259   False        False         False
9260   False        False         False
9261   False        False         False

[9262 rows x 3 columns]

Nesse exemplo, apenas um elemento tem o valor igual a 7603. Por isso apenas uma operação retornou True. É assim que o operador igual funciona, realiza uma operação para cada elemento do dataframe.
Nota: para os próximos exemplos vamos precisar de um dataframe que tenha valores ausentes. Por isso abra o dataset filmes.csv, num editor de texto, e apague os primeiros valores da coluna codigo_obra (é só apagar o valor entre as vírgulas).
Para o próximo exemplo vamos comparar o dataframe com ele mesmo. O esperado é que todos os resultados sejam True, mas não é bem isso que acontece.

>>> filmes == filmes
      indice  codigo_obra  ...  cnpj_requerente  data_exibicao
0       True         True  ...             True           True
1       True        False  ...             True           True
2       True         True  ...             True           True
3       True        False  ...             True           True
4       True         True  ...             True           True
...      ...          ...  ...              ...            ...
9257    True         True  ...             True           True
9258    True         True  ...             True           True
9259    True         True  ...             True           True
9260    True         True  ...             True           True
9261    True         True  ...             True           True

[9262 rows x 9 columns]

Podemos ver que, contrariando as nossas expectativas, recebemos alguns valores False. Isso acontece por causa dos objetos np.nan da biblioteca NumPy. Como vimos acima np.nan é diferente de np.nan. Como a biblioteca pandas faz uso desse objeto, para representar objetos vazios, qualquer dataframe que tenha um elemento vazio será diferente dele mesmo. E como saber se um dataframe é igual a outro? Com o método equals().

>>> filmes.equals(filmes)
True

O método equals() retorna True se os dataframes forem iguais.
Esse é o jeito certo de verificar se dois dataframes são iguais. Utilizando o operador igual, se tiver algum elemento vazio, eles não serão iguais. Com o método equals() isso não acontece.

0 comentários:

Postar um comentário