Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Identificar a posição de NaN na NumPy

Na aula sobre Lidando com NaNs na NumPy, aprendemos como identificar todos os valores NaN de um conjunto de dados com a sum(np.isnan(Kaliningrad)). Todavia, a identificação da posição NaN foi feita manualmente. Minha dúvida é: como identificar automaticamente as posições onde há NaNs, especialmente em um conjunto de dados muito grandes com mais de um valor ausente? Obrigado!

2 respostas
solução!

Olá, Cassiano! Como vai?

Vou te mostrar como fazer isso na prática, preparado?!

Pra isso, vou simular um DataFrame com 50 registros que possuirá alguns valores NaN inseridos de maneira aleatória.

import pandas as pd
import numpy as np

# Gerando 50 nomes com alguns NaNs
nomes = ['Ana', 'Bruno', 'Carlos', 'Daniela', 'Eduardo', 'Fernanda', 'Gustavo', 'Helena', 'Igor', 'Juliana']
nomes_50 = [np.random.choice(nomes) if np.random.rand() > 0.1 else None for _ in range(50)]

# Gerando 50 idades com alguns NaNs
idades_50 = [np.random.randint(18, 60) if np.random.rand() > 0.1 else None for _ in range(50)]

# Criando DataFrame
df = pd.DataFrame({
    'nome': nomes_50,
    'idade': idades_50
})

Logo em seguida, executamos o seguinte código:

df_nan = df[df.isna().any(axis=1)]
df_nan
  • O método .isna() retorna True onde há valor NaN, e False onde há valor válido.
  • E o método .any(axis=1) retorna True para a linha inteira se qualquer coluna tiver NaN.
  • Logo usamos df[df.isna().any(axis=1)] como filtro booleano para selecionar apenas as linhas com pelo menos um NaN.

Exemplo de resultado:

indexnomeidade
3BrunoNaN
743.0
9GustavoNaN
1151.0
12NaN
14CarlosNaN
2159.0
2333.0
3158.0
3253.0
35FernandaNaN
37NaN
4235.0
4932.0

Logo é possível observar apenas as posições com pelo menos um elemento ausente.

Mas não acaba por aí, Cassiano! Podemos usar o atributo .index para retornar somente os índices desse DataFrame df_nan. Assim:

df_nan.index

Exemplo de resultado:

Index([3, 7, 9, 11, 12, 14, 21, 23, 31, 32, 35, 37, 42, 49], dtype='int64')

Espero ter ajudado e fico à disposição se precisar.

Abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado

Muito interessante, obrigado!