
Puoi rimuovere i valori mancanti (NaN) da pandas.DataFrame, Series con dropna().
In questo articolo vengono descritti i seguenti contenuti.
- Rimuovi righe/colonne in cui tutti gli elementi mancano di valori:
how='all'
- Elimina righe/colonne che contengono almeno un valore mancante:
how='any' (default)
- Rimuovi righe/colonne in base al numero di valori non mancanti:
thresh
- Rimuovi in base a righe/colonne specifiche:
subset
- Operare sul posto:
inplace
- Per panda.Serie
Se desideri estrarre righe e colonne con valori mancanti, consulta il seguente articolo.
Vedere gli articoli seguenti su come sostituire e contare i valori mancanti.
Nota che non solo NaN (Not a Number) ma anche None viene trattato come un valore mancante nei panda.
Ad esempio, leggi un file CSV con valori mancanti con read_csv().
import pandas as pd
df = pd.read_csv('data/src/sample_pandas_normal_nan.csv')
print(df)
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 1 NaN NaN NaN NaN NaN
# 2 Charlie NaN CA NaN NaN
# 3 Dave 68.0 TX 70.0 NaN
# 4 Ellen NaN CA 88.0 NaN
# 5 Frank 30.0 NaN NaN NaN
Rimuovi righe/colonne in cui tutti gli elementi mancano di valori:how='all'
Impostando how=’all’, le righe in cui tutti gli elementi mancano di valori vengono rimosse.
print(df.dropna(how='all'))
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 2 Charlie NaN CA NaN NaN
# 3 Dave 68.0 TX 70.0 NaN
# 4 Ellen NaN CA 88.0 NaN
# 5 Frank 30.0 NaN NaN NaN
Se l’asse è impostato su 1 o su ‘colonne’, le colonne in cui tutti gli elementi sono privi di valori vengono rimosse.
print(df.dropna(how='all', axis=1))
# name age state point
# 0 Alice 24.0 NY NaN
# 1 NaN NaN NaN NaN
# 2 Charlie NaN CA NaN
# 3 Dave 68.0 TX 70.0
# 4 Ellen NaN CA 88.0
# 5 Frank 30.0 NaN NaN
Si noti che se l’asse è impostato su 0 o ‘indice’, le righe vengono rimosse. Poiché il valore predefinito dell’asse è 0, le righe vengono rimosse se omesse, come mostrato nel primo esempio.
Nelle versioni precedenti, sia le righe che le colonne vengono rimosse con asse=[0, 1], ma dalla versione 1.0.0 non è più possibile specificare l’asse con un elenco o una tupla.
Se vuoi voler sia le righe che le colonne, puoi applicare dropna().
# print(df.dropna(how='all', axis=[0, 1]))
# TypeError: supplying multiple axes to axis is no longer supported.
print(df.dropna(how='all').dropna(how='all', axis=1))
# name age state point
# 0 Alice 24.0 NY NaN
# 2 Charlie NaN CA NaN
# 3 Dave 68.0 TX 70.0
# 4 Ellen NaN CA 88.0
# 5 Frank 30.0 NaN NaN
Elimina righe/colonne che contengono almeno un valore mancante:how='any' (default)
Per utilizzare come esempio, rimuovere righe e colonne in cui tutti i valori sono mancanti.
df2 = df.dropna(how='all').dropna(how='all', axis=1)
print(df2)
# name age state point
# 0 Alice 24.0 NY NaN
# 2 Charlie NaN CA NaN
# 3 Dave 68.0 TX 70.0
# 4 Ellen NaN CA 88.0
# 5 Frank 30.0 NaN NaN
Impostando how=’any’, le righe che contengono almeno un valore mancante vengono rimosse. Poiché il valore predefinito di how è ‘any’, il risultato è lo stesso anche se omesso.
print(df2.dropna(how='any'))
# name age state point
# 3 Dave 68.0 TX 70.0
print(df2.dropna())
# name age state point
# 3 Dave 68.0 TX 70.0
Se l’asse è impostato su 1 o ‘colonne’, le colonne che contengono almeno un valore mancante vengono rimosse.
print(df2.dropna(axis=1))
# name
# 0 Alice
# 2 Charlie
# 3 Dave
# 4 Ellen
# 5 Frank
Rimuovi righe/colonne in base al numero di valori non mancanti:thresh
Con l’argomento trebbiare, puoi rimuovere righe e colonne in base al numero di valori non mancanti.
Ad esempio, se thresh=3, le righe che contengono più di tre valori non mancanti rimangono e le altre vengono rimosse.
print(df.dropna(thresh=3))
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 3 Dave 68.0 TX 70.0 NaN
# 4 Ellen NaN CA 88.0 NaN
Se l’asse è impostato su 1 o su ‘colonne’, le colonne vengono rimosse.
print(df.dropna(thresh=3, axis=1))
# name age state
# 0 Alice 24.0 NY
# 1 NaN NaN NaN
# 2 Charlie NaN CA
# 3 Dave 68.0 TX
# 4 Ellen NaN CA
# 5 Frank 30.0 NaN
Rimuovi in base a righe/colonne specifiche:subset
Se desideri rimuovere in base a righe e colonne specifiche, specifica un elenco di etichette (nomi) di righe/colonne nell’argomento del sottoinsieme di dropna(). Anche se vuoi impostare una sola etichetta, devi specificarla come un elenco, come subset=[‘name’].
Poiché l’impostazione predefinita è how=’any’ e axis=0, le righe con valori mancanti nelle colonne specifiche dal sottoinsieme vengono rimosse.
print(df.dropna(subset=['age']))
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 3 Dave 68.0 TX 70.0 NaN
# 5 Frank 30.0 NaN NaN NaN
print(df.dropna(subset=['age', 'state']))
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 3 Dave 68.0 TX 70.0 NaN
Vedi come è impostato su ‘all’, le righe con valori mancanti in tutte le colonne specificate vengono rimosse.
print(df.dropna(subset=['age', 'state'], how='all'))
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 2 Charlie NaN CA NaN NaN
# 3 Dave 68.0 TX 70.0 NaN
# 4 Ellen NaN CA 88.0 NaN
# 5 Frank 30.0 NaN NaN NaN
Se l’asse è impostato su 1 o su ‘colonne’, le colonne vengono rimosse.
print(df.dropna(subset=[0, 4], axis=1))
# name state
# 0 Alice NY
# 1 NaN NaN
# 2 Charlie CA
# 3 Dave TX
# 4 Ellen CA
# 5 Frank NaN
print(df.dropna(subset=[0, 4], axis=1, how='all'))
# name age state point
# 0 Alice 24.0 NY NaN
# 1 NaN NaN NaN NaN
# 2 Charlie NaN CA NaN
# 3 Dave 68.0 TX 70.0
# 4 Ellen NaN CA 88.0
# 5 Frank 30.0 NaN NaN
Viene generato un errore se viene specificato un nome di riga o colonna inesistente. Viene generato un errore anche se si imposta asse=1 ma si specificano i nomi di colonna o si imposta asse=0 (predefinito) ma si specificano i nomi di riga.
# print(df.dropna(subset=['age', 'state', 'xxx']))
# KeyError: ['xxx']
# print(df.dropna(subset=['age', 'state'], axis=1))
# KeyError: ['age', 'state']
Operare sul posto:inplace
Come mostrato negli esempi precedenti, per viene visualizzato come predefinito, viene restituito un nuovo oggetto l’oggetto originale non modificato, ma se inplace=True, l’oggetto originale stesso viene aggiornato.
df.dropna(subset=['age'], inplace=True)
print(df)
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 3 Dave 68.0 TX 70.0 NaN
# 5 Frank 30.0 NaN NaN NaN
Per panda.Serie
L’unico argomento valido per dropna() di pandas.Series è in atto. Poiché si tratta di dati unidimensionali, gli elementi con valori mancanti vengono semplicemente rimossi.
s = pd.read_csv('data/src/sample_pandas_normal_nan.csv')['age']
print(s)
# 0 24.0
# 1 NaN
# 2 NaN
# 3 68.0
# 4 NaN
# 5 30.0
# Name: age, dtype: float64
print(s.dropna())
# 0 24.0
# 3 68.0
# 5 30.0
# Name: age, dtype: float64
s.dropna(inplace=True)
print(s)
# 0 24.0
# 3 68.0
# 5 30.0
# Name: age, dtype: float64