HOWTO · Python

Rimuovi NaN dalla lista in Python

Questo tutorial mostra come rimuovere NaN dalla lista in Python.

In questa pagina

NaN è un valore speciale in virgola mobile, comunemente usato per rappresentare un risultato numerico indefinito o non rappresentabile. È diverso dalla normale stringa 'nan'. Per una lista di numeri, usa math.isnan() di Python; per gli array numerici, numpy.isnan() di NumPy è pratico. Per rimuovere la stringa letterale 'nan', confronta direttamente i valori. Se i dati misti contengono sia NaN numerici sia la stringa 'nan', combina pandas.isnull() con un confronto tra stringhe.

Rimuovere NaN da una lista Python con math.isnan()

La funzione math.isnan() della libreria standard di Python individua i valori numerici NaN. È una funzione, non un metodo. NaN non è uguale a sé stesso, quindi un controllo come x != x può individuarlo; math.isnan() rende però più chiaro l’intento. Usa questo approccio quando la lista contiene valori numerici accettati da math.isnan(); non è un controllo generico per stringhe o oggetti arbitrari. Consulta il riferimento a math.isnan(). Il riferimento localizzato in italiano non è disponibile, quindi il collegamento rimanda alla pagina inglese.

Questo esempio completo filtra una lista numerica senza modificare quella originale:

import math

values = [1, 2, float("nan"), 4]
without_nan = [value for value in values if not math.isnan(value)]
print(without_nan)
[1, 2, 4]

Rimuovere NaN da una lista Python con numpy.isnan()

Se NumPy fa già parte del tuo progetto, numpy.isnan() applica un controllo numerico a una lista o a un array. Se necessario, installa NumPy con python -m pip install numpy. L’esempio converte l’input in un array, crea una maschera booleana, seleziona i valori che non sono NaN e riconverte il risultato in una lista Python. Il risultato finale è quindi una lista, non un array NumPy.

import numpy as np

values = [1, 2, np.nan, 4]
array = np.array(values)
without_nan = array[~np.isnan(array)].tolist()
print(without_nan)
[1.0, 2.0, 4.0]

Rimuovere la stringa ’nan’ da una lista Python

Una stringa sentinella è testo normale, non un NaN in virgola mobile. Se i tuoi dati sono già una lista di stringhe, rimuovi il valore esatto 'nan' in minuscolo confrontando direttamente ogni elemento. In questo modo, tipo e grafia di ogni elemento mantenuto restano invariati. Modifica il confronto se i tuoi dati usano maiuscole o spaziatura diverse.

values = ["1", "2", "nan", "8"]
without_string_nan = [value for value in values if value != "nan"]
print(without_string_nan)
['1', '2', '8']

Se prima converti ogni elemento con str(), anche i numeri mantenuti diventano stringhe. Può essere utile per normalizzare i dati, ma cambia i tipi del risultato; non serve se vuoi soltanto rimuovere una stringa già presente nella lista.

Rimuovere NaN e la stringa ’nan’ da una lista Python mista con pandas.isnull()

Per una lista mista, usa pandas.isnull() per individuare i valori mancanti, come NaN numerici, poi verifica separatamente se ogni valore corrisponde alla stringa letterale 'nan'. pandas.isnull() non considera la stringa 'nan' un valore mancante. L’esempio seguente richiede pandas (python -m pip install pandas) e mantiene invariati i tipi delle altre stringhe e dei numeri. Il riferimento a pandas.isnull() descrive il controllo dei valori mancanti.

import pandas as pd

values = ["Ada", 23, "nan", "London", float("nan")]
without_missing_or_string_nan = [
    value
    for value in values
    if not pd.isnull(value) and value != "nan"
]
print(without_missing_or_string_nan)
['Ada', 23, 'London']