English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Dados Perdidos do Pandas

Exemplo de operação de perda de dados no Pandas

Na vida real, a perda de dados sempre é um problema. Áreas como aprendizado de máquina e mineração de dados enfrentam sérios problemas de precisão na predição de modelos, pois os valores ausentes levam a uma qualidade de dados pior. Nesses campos, o tratamento de valores ausentes é o principal foco para tornar os modelos mais precisos e eficazes.

Quando e por que os dados são perdidos?

Vamos considerar uma pesquisa online de um produto. Muitas vezes, as pessoas não compartilham todas as informações sobre elas. Poucos compartilham suas experiências, mas não compartilham quanto tempo usaram o produto; poucos compartilham o tempo que usaram o produto, suas experiências em vez de suas informações de contato. Portanto, de alguma forma ou de outra, sempre haverá uma parte dos dados perdidos, o que é muito comum em situações reais.
Agora vamos ver como usar o Pandas para lidar com valores ausentes (por exemplo, NA ou NaN).

# importar a biblioteca pandas
 import pandas as pd
 import numpy as np
 df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
 ,'h'], columns=['one', 'two', 'three'])
 df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
 imprimir(df)

Os resultados da execução são os seguintes:

       um                               dois                               três
a  -0.576991  -0.741695  0.553172
b                               NaN                               NaN                               NaN
c         0.744328  -1.735166  1.749580
NaN substituído por '0':
         um                               dois                               três
a  -0.576991  -0.741695  0.553172
b         0.000000         0.000000         0.000000
c         0.744328  -1.735166  1.749580

Usando reindexação, criamos um DataFrame com valores ausentes. No output, NaN representa que não é um número.

Verificação de valores ausentes

Para tornar a detecção de valores ausentes mais fácil (e para diferentes tipos de dados de arrays), o Pandas oferece as funções ISNULL() e NOTNULL(), que também são métodos para objetos de séries e frames de dados.-

Instância 1

 import pandas as pd
 import numpy as np
  
 df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
 ,'h'], columns=['one', 'two', 'three'])
 df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
 print(df['one'].isnull())

Os resultados da execução são os seguintes:

 a    False
 b    True
 c    False
 d    True
 e    False
 f    False
 g    True
 h    False
 Nome: um, dtype: bool

Instância 2

 import pandas as pd
 import numpy as np
 df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
 ,'h'], columns=['one', 'two', 'three'])
 df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
 print(df['one'].notnull())

Os resultados da execução são os seguintes:

 a    True
 b    False
 c    True
 d    False
 e    True
 f    True
 g False
 h True
 Nome: um, dtype: bool

Cálculo de dados ausentes

Cálculo de dados ausentes ao fazer a agregação de dados, NA será considerado zero Se todos os dados forem inaplicáveis, o resultado será inaplicável

Instância 1

 import pandas as pd
 import numpy as np
 df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
 ,'h'], columns=['one', 'two', 'three'])
 df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
 imprimir(df['one'].sum())

Os resultados da execução são os seguintes:

   2.02357685917

Instância 2

 import pandas as pd
 import numpy as np
 df = pd.DataFrame(index=[0,1,2,3,4,5],colunas=['one','two'])
 imprimir(df['one'].sum()

Os resultados da execução são os seguintes:

   nan

Limpeza/Preenchimento de dados ausentes

O Pandas oferece várias maneiras de eliminar valores ausentes. A função fillna pode usar os seguintes métodos para preencher valores NA com dados não nulos.

Substituição de NaN por valor escalar

O seguinte programa mostra como substituir 'NaN' por '0'.

 import pandas as pd
 import numpy as np
 df = pd.DataFrame(np.random.randn(3, 3],colunas=['one','two'])
 )
 df = df.reindex(['a', 'b', 'c'])
 imprimir(df)
 imprimir(("NaN substituído por '0':"))
 imprimir(df.fillna(0))

Os resultados da execução são os seguintes:

       um                               dois                               três
a  -0.576991  -0.741695  0.553172
b                               NaN                               NaN                               NaN
c         0.744328  -1.735166  1.749580
NaN substituído por '0':
         um                               dois                               três
a  -0.576991  -0.741695  0.553172
b         0.000000         0.000000         0.000000
c         0.744328  -1.735166  1.749580

Aqui, preenchemos com zero; por outro lado, também podemos preencher com qualquer outro valor.

Preenchimento para frente e para trás de NA

Usando o conceito de preenchimento discutido no capítulo 'Reindexação', preencheremos os valores ausentes.

MétodoOperação
pad/fillPreenchimento para frente<
bfill/backfillPreenchimento para trás

Instância 1

 import pandas as pd
 import numpy as np
 df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
 ,'h'], columns=['one', 'two', 'three'])
 df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
 imprimir(df.fillna(method='pad'))

Os resultados da execução são os seguintes:

       um                               dois                               três
a         0.077988   0.476149   0.965836
b         0.077988   0.476149   0.965836
c  -0.390208  -0.551605  -2.301950
d  -0.390208  -0.551605  -2.301950
e  -2.000303  -0.788201   1.510072
f  -0.930230  -0.670473   1.146615
g  -0.930230  -0.670473   1.146615
h         0.085100         0.532791   0.887415

Instância 2

 import pandas as pd
 import numpy as np
 df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
 ,'h'], columns=['one', 'two', 'three'])
 df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
 imprimir(df.fillna(method='backfill'))

Os resultados da execução são os seguintes:

       um                               dois                               três
a         0.077988   0.476149   0.965836
b  -0.390208  -0.551605  -2.301950
c  -0.390208  -0.551605  -2.301950
d  -2.000303  -0.788201   1.510072
e  -2.000303  -0.788201   1.510072
f  -0.930230  -0.670473   1.146615
g         0.085100         0.532791   0.887415
h         0.085100         0.532791   0.887415

Excluir valores ausentes

Se desejar excluir apenas valores ausentes, use a função dropna com o parâmetro axis juntos. Pelo padrão, axis = 0, ou seja, ao longo das linhas, o que significa que se qualquer valor for NA em uma linha, toda a linha será excluída.

Instância 1

 import pandas as pd
 import numpy as np
 df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
 ,'h'], columns=['one', 'two', 'three'])
 df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
 imprimir(df.dropna())

Os resultados da execução são os seguintes:

  
   um dois três um 0.077988 0.476149 0.965836 c -0.390208 -0.551605 -2.301950 e -2.000303 -0.788201 1.510072 f -0.930230 -0.670473 1.146615 h 0.085100 0.532791 0.887415

Instância 2

 import pandas as pd
 import numpy as np
 df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
 ,'h'], columns=['one', 'two', 'three'])
 df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
 print(df.dropna(axis=1))

Os resultados da execução são os seguintes:

 DataFrame Vazio
 Colunas: []
 Índice: [a, b, c, d, e, f, g, h]

Substituição de valores ausentes (ou) genéricos

Muitas vezes, devemos substituir um valor específico por um valor genérico. Podemos fazer isso aplicando o método replace().
Substituir valores N/A por valores escalares é o comportamento equivalente da função fillna().

Instância 1

 import pandas as pd
 import numpy as np
 df = pd.DataFrame({'one': [10,20,30,40,50,2000], 'two': [1000,0,30,40,50,60]})
 print(df.replace({1000:10,2000:60})

Os resultados da execução são os seguintes:

   one two
 0 10 10
 1 20 0
 2 30 30
 3 40 40
 4 50 50
 5 60 60

Instância 2

 import pandas as pd
 import numpy as np
 df = pd.DataFrame({'one': [10,20,30,40,50,2000], 'two': [1000,0,30,40,50,60]})
 print(df.replace({1000:10,2000:60)

Os resultados da execução são os seguintes:

   one two
 0 10 10
 1 20 0
 2 30 30
 3 40 40
 4 50 50
 5 60 60