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

Dati mancanti di Pandas

Pandas example of data loss operation

In real life, data loss is always a problem. Fields such as machine learning and data mining face serious problems in the accuracy of model predictions because missing values lead to poor data quality. In these fields, handling missing values is a major focus to make models more accurate and effective.

When and why data is lost?

Let's consider an online survey of a product. Many times, people do not share all the information related to them. Very few people share their experiences, but do not share how long they have used the product; very few people share how long they have used the product, their experiences rather than their contact information. Therefore, in some way or another, some data is always lost, which is very common in real-time situations.
Now let's see how to use pandas to handle missing values (such as NA or NaN).

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

I risultati dell'esecuzione sono i seguenti:

       uno        due     tre
a  -0.576991  -0.741695  0.553172
b        NaN        NaN       NaN
c 0.744328 -1.735166 1.749580
NaN sostituito con '0':
         uno        due     tre
a  -0.576991  -0.741695  0.553172
b   0.000000   0.000000  0.000000
c 0.744328 -1.735166 1.749580

Utilizzando il riindicizzamento, abbiamo creato un DataFrame con valori mancanti. Nei risultati, NaN rappresenta non un numero.

Controllare i valori mancanti

Per rendere più facile (e diverso) la detezione dei valori mancanti (e diversi array dtypes), pandas fornisce le funzioni ISNULL() e NOTNULL(), che sono anche metodi per gli oggetti serie 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['uno'].isnull())

I risultati dell'esecuzione sono i seguenti:

 a  False
 b  True
 c  False
 d  True
 e  False
 f  False
 g  True
 h  False
 Nome: uno, 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['uno'].notnull())

I risultati dell'esecuzione sono i seguenti:

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

Calcolo dei dati mancanti

Quando si sommano dati, i valori NA vengono considerati come zero Se i dati sono tutti inapplicabili, il risultato è inapplicabile

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

I risultati dell'esecuzione sono i seguenti:

   2.02357685917

Esempio 2

 import pandas as pd,
 import numpy as np,
 df = pd.DataFrame(index=[0,1,2,3,4,5],columns=['uno','due'])
 print(df['uno'].sum())

I risultati dell'esecuzione sono i seguenti:

   nan

Pulizia / riempimento dei dati mancanti

Pandas fornisce più metodi per eliminare valori mancanti. La funzione fillna può essere utilizzata per riempire i valori NA con dati non vuoti in vari modi.

Sostituire 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=['uno',
 ''due', 'tre'])
 df = df.reindex(['a', 'b', 'c']))
 print(df)
 print(("NaN sostituito con '0':"))
 print(df.fillna(0))

I risultati dell'esecuzione sono i seguenti:

       uno        due     tre
a  -0.576991  -0.741695  0.553172
b        NaN        NaN       NaN
c 0.744328 -1.735166 1.749580
NaN sostituito con '0':
         uno        due     tre
a  -0.576991  -0.741695  0.553172
b   0.000000   0.000000  0.000000
c 0.744328 -1.735166 1.749580

In questo caso, riempiamo con zero; al contrario, possiamo anche riempire con altri valori.

Riempimento in avanti e indietro di NA

Utilizzando il concetto di riempimento discusso nel capitolo 'Riorganizzazione degli indici', riempiremo i valori mancanti.

MetodoOperazione
pad/fillRiempimento in avanti <
bfill/backfillRiempimento in avanti

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

I risultati dell'esecuzione sono i seguenti:

       uno due tre
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'))

I risultati dell'esecuzione sono i seguenti:

       uno due tre
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

Eliminazione dei valori mancanti

Se si desidera escludere solo i valori mancanti, utilizzare la funzione dropna insieme al parametro axis. Di default, axis = 0, ovvero lungo le righe, il che significa che se qualsiasi valore in una riga è NA, l'intera riga verrà 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())

I risultati dell'esecuzione sono i seguenti:

  
   uno due tre 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)),

I risultati dell'esecuzione sono i seguenti:

 DataFrame vuoto
 Colonne: []
 Indice: [a, b, c, d, e, f, g, h]

Sostituire valori mancanti (o) universali

Spesso, dobbiamo sostituire un valore universale con un valore specifico. Possiamo farlo applicando il metodo replace().
Sostituire NA con un valore scalare è un comportamento equivalente alla funzione fillna().

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

I risultati dell'esecuzione sono i seguenti:

   uno due
 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})),

I risultati dell'esecuzione sono i seguenti:

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