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

Pérdida de datos en Pandas

Ejemplo de operación de pérdida de datos en Pandas

En la vida real, la pérdida de datos siempre es un problema. El aprendizaje automático y la minería de datos, entre otros campos, enfrentan problemas graves en la precisión de la predicción de los modelos, ya que los valores faltantes pueden llevar a una calidad de datos deficiente. En estos campos, el manejo de valores faltantes es un punto principal para hacer que los modelos sean más precisos y efectivos.

Cuándo y por qué se pierden datos?

Consideremos una encuesta en línea de un producto. Muchas veces, las personas no comparten toda la información relacionada con ellos. Pocas personas comparten su experiencia, pero no comparten cuánto tiempo han utilizado el producto; pocas personas comparten el tiempo que han utilizado el producto, sus experiencias en lugar de su información de contacto. Por lo tanto, de alguna manera u otra siempre se perderá una parte de los datos, lo cual es muy común en situaciones en tiempo real.
Ahora veamos cómo manejar valores faltantes utilizando Pandas (por ejemplo, NA o NaN).

# importar la 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)

Los resultados de la ejecución son los siguientes:

       uno                      dos                      tres
a  -0.576991  -0.741695  0.553172
b                      NaN                      NaN                      NaN
c      0.744328  -1.735166  1.749580
NaN reemplazado con '0':
         uno                      dos                      tres
a  -0.576991  -0.741695  0.553172
b      0.000000      0.000000      0.000000
c      0.744328  -1.735166  1.749580

Usando la reindexación, creamos un DataFrame con valores faltantes. En la salida, NaN representa que no es un número.

Verificación de valores faltantes

Para facilitar la detección de valores faltantes (y diferentes dtypes de arrays), Pandas proporciona las funciones ISNULL() y NOTNULL(), que también son métodos para objetos de series y DataFrames.-

Instancia 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())

Los resultados de la ejecución son los siguientes:

 a  Falso
 b  Verdadero
 c  Falso
 d  Verdadero
 e  Falso
 f  Falso
 g  Verdadero
 h  Falso
 Nombre: one, tipo: bool

Instancia 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())

Los resultados de la ejecución son los siguientes:

 a  Verdadero
 b  Falso
 c  Verdadero
 d  Falso
 e  Verdadero
 f  Verdadero
 g      False
 h      True
 Nombre: one, tipo: bool

Cálculo de datos perdidos

Al resumir datos, NA se considerará cero Si todos los datos son inaplicables, el resultado es inaplicable

Instancia 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())

Los resultados de la ejecución son los siguientes:

   2.02357685917

Instancia 2

 import pandas as pd
 import numpy as np
 df = pd.DataFrame(índice=[0,1,2,3,4,5], columnas=['uno',
 imprimir(df['one'].sum())

Los resultados de la ejecución son los siguientes:

   nan

Limpieza/Rellenar datos perdidos

Pandas ofrece varios métodos para eliminar valores perdidos. La función fillna puede usar los siguientes métodos para 'rellenar' valores NA con datos no nulos.

Reemplazar NaN con un valor escalar

El siguiente programa muestra cómo reemplazar 'NaN' con '0'.

 import pandas as pd
 import numpy as np
 df = pd.DataFrame(np.random.randn(3, 3]), índice=['a', 'c', 'e'], columnas=['uno',
 '], índice=['a', 'c', 'e'], columnas=['uno',
 df = df.reindex(['a', 'b', 'c'])
 imprimir(df)
 imprimir(\"NaN reemplazado con '0':\
 imprimir(df.fillna(0))

Los resultados de la ejecución son los siguientes:

       uno                      dos                      tres
a  -0.576991  -0.741695  0.553172
b                      NaN                      NaN                      NaN
c      0.744328  -1.735166  1.749580
NaN reemplazado con '0':
         uno                      dos                      tres
a  -0.576991  -0.741695  0.553172
b      0.000000      0.000000      0.000000
c      0.744328  -1.735166  1.749580

Aquí, llenamos con cero; por el contrario, también podemos llenar con cualquier otro valor.

Rellenar hacia adelante y hacia atrás NA

Usando el concepto de relleno discutido en el capítulo 'Reindexación', llenaremos los valores faltantes.

MétodoOperación
pad/rellenarRellenar hacia adelante<
bfill/backfillRellenar hacia adelante

Instancia 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(método='pad'))

Los resultados de la ejecución son los siguientes:

       uno                      dos                      tres
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

Instancia 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(método='backfill'))

Los resultados de la ejecución son los siguientes:

       uno                      dos                      tres
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

Eliminar valores perdidos

Si solo desea excluir valores perdidos, utilice la función dropna junto con el parámetro axis. Por defecto, axis = 0, lo que significa que si cualquier valor en una fila es NA, se excluirá toda la fila.

Instancia 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())

Los resultados de la ejecución son los siguientes:

  
   uno dos tres un 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

Instancia 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))

Los resultados de la ejecución son los siguientes:

 DataFrame vacío
 Columnas: []
 Índice: [a, b, c, d, e, f, g, h]

Reemplazar valores faltantes (o) genéricos

Muchas veces, debemos reemplazar un valor genérico con un valor específico. Podemos lograrlo aplicando el método replace().
Reemplazar NA con un valor escalar es el comportamiento equivalente de la función fillna().

Instancia 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}))

Los resultados de la ejecución son los siguientes:

   uno dos
 0 10 10
 1 20 0
 2 30 30
 3 40 40
 4 50 50
 5 60 60

Instancia 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)

Los resultados de la ejecución son los siguientes:

   uno dos
 0 10 10
 1 20 0
 2 30 30
 3 40 40
 4 50 50
 5 60 60