Skip to content

pandas: Estrarre righe/colonne con valori mancanti (NaN)

Python

Puoi estrarre righe/colonne contenenti valori mancanti da pandas.DataFrame utilizzando il metodo isnull() o isna() che controlla se un elemento è un valore mancante.

In questo articolo vengono descritti i seguenti contenuti.

  • Estrai righe/colonne con valori mancanti in colonne/righe specifiche
  • Estrarre righe/colonne con almeno un valore mancante

Utilizzare il metodo dropna() per estrarre righe/colonne in cui tutti gli elementi sono valori non mancanti, ovvero rimuovere righe/colonne contenenti valori mancanti. Vedere il seguente articolo per i dettagli.

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

Estrai righe/colonne con valori mancanti in colonne/righe specifiche

È possibile utilizzare il metodo isnull() o isna() di pandas.DataFrame e Series per verificare se ogni elemento è un valore mancante o meno.

print(df.isnull())
#     name    age  state  point  other
# 0  False  False  False   True   True
# 1   True   True   True   True   True
# 2  False   True  False   True   True
# 3  False  False  False  False   True
# 4  False   True  False  False   True
# 5  False  False   True   True   True

isnull() è un alias per isna(), il cui utilizzo è lo stesso. In questo articolo viene utilizzato principalmente isnull(), ma puoi sostituirlo con isna().

Se vuoi estrarre righe con valori mancanti in una colonna specifica, usa il risultato di isnull() per quella colonna.

print(df['point'].isnull())
# 0     True
# 1     True
# 2     True
# 3    False
# 4    False
# 5     True
# Name: point, dtype: bool

print(df[df['point'].isnull()])
#       name   age state  point  other
# 0    Alice  24.0    NY    NaN    NaN
# 1      NaN   NaN   NaN    NaN    NaN
# 2  Charlie   NaN    CA    NaN    NaN
# 5    Frank  30.0   NaN    NaN    NaN

Il concetto è lo stesso quando si estraggono colonne con valori mancanti in una riga specifica. Usa loc[] per selezionare per nome (etichetta) e iloc[] per selezionare per posizione.

print(df.iloc[2].isnull())
# name     False
# age       True
# state    False
# point     True
# other     True
# Name: 2, dtype: bool

print(df.loc[:, df.iloc[2].isnull()])
#     age  point  other
# 0  24.0    NaN    NaN
# 1   NaN    NaN    NaN
# 2   NaN    NaN    NaN
# 3  68.0   70.0    NaN
# 4   NaN   88.0    NaN
# 5  30.0    NaN    NaN

Estrarre righe/colonne con almeno un valore mancante

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

Usa il metodo any() che restituisce True se è presente almeno un True in ogni riga/colonna. Per impostazione predefinita, viene applicato alle colonne. Se asse=1, viene applicato alle righe.

Chiamando any() dal risultato di isnull(), puoi verificare se ogni riga e colonna contiene almeno un valore mancante.

Estrarre le righe che contengono almeno un valore mancante

print(df2.isnull())
#     name    age  state  point
# 0  False  False  False   True
# 2  False   True  False   True
# 3  False  False  False  False
# 4  False   True  False  False
# 5  False  False   True   True

print(df2.isnull().any(axis=1))
# 0     True
# 2     True
# 3    False
# 4     True
# 5     True
# dtype: bool

print(df2[df2.isnull().any(axis=1)])
#       name   age state  point
# 0    Alice  24.0    NY    NaN
# 2  Charlie   NaN    CA    NaN
# 4    Ellen   NaN    CA   88.0
# 5    Frank  30.0   NaN    NaN

Estrarre le colonne che contengono almeno un valore mancante

print(df2.isnull().any())
# name     False
# age       True
# state     True
# point     True
# dtype: bool

print(df2.loc[:, df2.isnull().any()])
#     age state  point
# 0  24.0    NY    NaN
# 2   NaN    CA    NaN
# 3  68.0    TX   70.0
# 4   NaN    CA   88.0
# 5  30.0   NaN    NaN