Skip to content

pandas: Rimuovere i valori mancanti (NaN) con dropna()

Python

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