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