Panda Python - Dati mancanti

I dati mancanti sono sempre un problema negli scenari di vita reale. Aree come l'apprendimento automatico e il data mining devono affrontare gravi problemi nell'accuratezza delle previsioni del modello a causa della scarsa qualità dei dati causata da valori mancanti. In queste aree, il trattamento del valore mancante è un punto importante per rendere i loro modelli più accurati e validi.

Quando e perché i dati vengono persi?

Consideriamo un sondaggio online per un prodotto. Molte volte, le persone non condividono tutte le informazioni relative a loro. Poche persone condividono la loro esperienza, ma non per quanto tempo utilizzano il prodotto; poche persone condividono per quanto tempo utilizzano il prodotto, la loro esperienza ma non le informazioni di contatto. Pertanto, in un modo o nell'altro una parte dei dati manca sempre, e questo è molto comune in tempo reale.

Vediamo ora come possiamo gestire i valori mancanti (diciamo NA o NaN) usando Pandas.

# import the pandas library
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

Suo output è il seguente -

one        two      three
a   0.077988   0.476149   0.965836
b        NaN        NaN        NaN
c  -0.390208  -0.551605  -2.301950
d        NaN        NaN        NaN
e  -2.000303  -0.788201   1.510072
f  -0.930230  -0.670473   1.146615
g        NaN        NaN        NaN
h   0.085100   0.532791   0.887415

Utilizzando la reindicizzazione, abbiamo creato un DataFrame con valori mancanti. Nell'output,NaN si intende Not a Number.

Verifica i valori mancanti

Per rendere più facile il rilevamento dei valori mancanti (e attraverso diversi dtypes di array), Pandas fornisce l'estensione isnull() e notnull() funzioni, che sono anche metodi su oggetti Series e DataFrame -

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

Suo output è il seguente -

a  False
b  True
c  False
d  True
e  False
f  False
g  True
h  False
Name: one, dtype: bool

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

Suo output è il seguente -

a  True
b  False
c  True
d  False
e  True
f  True
g  False
h  True
Name: one, dtype: bool

Calcoli con dati mancanti

  • Quando si sommano i dati, NA verrà considerato zero
  • Se i dati sono tutti NA, il risultato sarà NA

Esempio 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'].sum()

Suo output è il seguente -

2.02357685917

Esempio 2

import pandas as pd
import numpy as np

df = pd.DataFrame(index=[0,1,2,3,4,5],columns=['one','two'])
print df['one'].sum()

Suo output è il seguente -

nan

Pulizia / riempimento dei dati mancanti

Pandas fornisce vari metodi per pulire i valori mancanti. La funzione fillna può "riempire" valori NA con dati non nulli in un paio di modi, che abbiamo illustrato nelle sezioni seguenti.

Sostituisci NaN con un valore scalare

Il seguente programma mostra come sostituire "NaN" con "0".

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(3, 3), index=['a', 'c', 'e'],columns=['one',
'two', 'three'])

df = df.reindex(['a', 'b', 'c'])

print df
print ("NaN replaced with '0':")
print df.fillna(0)

Suo output è il seguente -

one        two     three
a  -0.576991  -0.741695  0.553172
b        NaN        NaN       NaN
c   0.744328  -1.735166  1.749580

NaN replaced with '0':
         one        two     three
a  -0.576991  -0.741695  0.553172
b   0.000000   0.000000  0.000000
c   0.744328  -1.735166  1.749580

Qui, stiamo riempiendo con il valore zero; invece possiamo anche riempire con qualsiasi altro valore.

Riempi NA Avanti e Indietro

Utilizzando i concetti di riempimento discussi nel Capitolo ReIndexing riempiremo i valori mancanti.

Suor n Metodo e azione
1

pad/fill

Metodi di riempimento Avanti

2

bfill/backfill

Metodi di riempimento all'indietro

Esempio 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.fillna(method='pad')

Suo output è il seguente -

one        two      three
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

Esempio 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.fillna(method='backfill')

Suo output è il seguente -

one        two      three
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

Elimina i valori mancanti

Se vuoi semplicemente escludere i valori mancanti, usa il dropna funzione insieme a axisdiscussione. Per impostazione predefinita, axis = 0, cioè lungo la riga, il che significa che se un valore all'interno di una riga è NA, l'intera riga viene esclusa.

Esempio 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.dropna()

Suo output è il seguente -

one        two      three
a   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

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

Suo output è il seguente -

Empty DataFrame
Columns: [ ]
Index: [a, b, c, d, e, f, g, h]

Sostituisci i valori generici mancanti (o)

Molte volte, dobbiamo sostituire un valore generico con un valore specifico. Possiamo ottenere questo risultato applicando il metodo di sostituzione.

Sostituire NA con un valore scalare è un comportamento equivalente di fillna() funzione.

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

Suo output è il seguente -

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

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

Suo output è il seguente -

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