Skip to content

nan (non un numero) in Python

Python

In Python, il tipo float ha nan. nan sta per “non un numero” ed è definito dallo standard a virgola mobile IEEE 754.

In questo articolo vengono descritti i seguenti contenuti.

  • nan è un valore float in Python
  • Crea nonna:float('nan'), math.nan, numpy.nan
  • Controlla se un valore è nan:math.isnan(), np.isnan()
  • Comportamento per gli operatori di confronto (<, >, ==, ! =) con nan
  • Controlla nan nell’istruzione se
  • Rimuovi e sostituisci nan in un elenco
  • Operazioni con nan

Vedi i seguenti articoli su come rimuovere e sostituire nan in NumPy e panda.

nan è un valore float in Python

In Python, il tipo float ha nan. Puoi creare nan con float(‘nan’). Altri metodi di creazione sono descritti più avanti.

import math

import numpy as np
import pandas as pd

print(float('nan'))
# nan

print(type(float('nan')))
# <class 'float'>

Ad esempio, se leggi un file CSV in NumPy o panda, i valori mancanti sono rappresentati da nan (NaN in panda).

a = np.genfromtxt('data/src/sample_nan.csv', delimiter=',')
print(a)
# [[11. 12. nan 14.]
#  [21. nan nan 24.]
#  [31. 32. 33. 34.]]

df = pd.read_csv('data/src/sample_pandas_normal_nan.csv')[:3]
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

Crea nonna:float('nan'), math.nan, numpy.nan

Come sopra descritto, puoi creare nan con float(‘nan’). Non facole tra maiuscole, quindi puoi usare “NaN” e “NAN”.

print(float('nan'))
# nan

print(float('NaN'))
# nan

print(float('NAN'))
# nan

Inoltre, nan può essere creato da math (libreria standard) e NumPy; sia NaN che NAN sono definiti come alias in NumPy.

print(math.nan)
# nan

print(np.nan)
# nan

print(np.NaN)
# nan

print(np.NAN)
# nan

Sono equivalenti in un metodo dal metodo per creare utilizzatori.

Controlla se un valore è nan:math.isnan(), np.isnan()

Puoi controllare se un valore è nan o meno con math.isnan().

print(math.isnan(float('nan')))
# True

print(math.isnan(math.nan))
# True

print(math.isnan(np.nan))
# True

Viene fornito anche numpy.isnan().

Oltre ai valori scalari, è possibile specificare come argomenti oggetti simili a array come elenchi e array NumPy ndarray.

print(np.isnan(float('nan')))
# True

print(np.isnan([float('nan'), math.nan, np.nan, 0]))
# [ True  True  True False]

pandas.DataFrame e Series hanno il metodo isna() e il suo alias isnull(), che restituisce True per nan e None.

Viene generato un errore se viene specificato Nessuno per math.isnan() o np.isnan().

Comportamento per gli operatori di confronto (<, >, ==, ! =) con nan

Quando si confronta con nan, <, > ==, <= e >= restituiscono sempre False e !=, restituisce sempre True.

print(10 < float('nan'))
# False

print(10 > float('nan'))
# False

print(10 == float('nan'))
# False

print(10 != float('nan'))
# True

Lo stesso vale per i confronti nan e nan. Nota che == e != danno risultati controintuitivi.

Qualsiasi cosa ordinata da un numero con un valore diverso da un numero è falso. Un’implicazione contro-intuitiva è che i valori non-numero non sono uguali a se stessi. Ad esempio, se x = float(‘NaN’), 3 < x, x < 3 ex == x sono tutti falsi, mentre x != x è vero. Questo comportamento è conforme a IEEE 754.
6. Espressioni – Confronti di valori — Documentazione Python 3.10.2

print(float('nan') == float('nan'))
# False

print(float('nan') != float('nan'))
# True

Per verificare se un valore è nan, usa math.isnan() e numpy.isnan() invece di ==.

Controlla nan nell’istruzione se

In Python, anche gli oggetti diversi da True e False sono considerati veri o falsi nell’espressione condizionale dell’istruzione if. Ad esempio, la stringa vuota ” o il numero 0 è considerato falsa e altre stringhe o numeri sono considerati veri.

Come puoi vedere con bool(), nan viene valutato come True.

print(bool(float('nan')))
# True

Usa math.isnan() o numpy.isnan().

x = float('nan')

if math.isnan(x):
    print('This is nan.')
else:
    print('This is not nan.')
# This is nan.
x = 100

if math.isnan(x):
    print('This is nan.')
else:
    print('This is not nan.')
# This is not nan.

Rimuovi e sostituisci nan in un elenco

Se vuoi rimuovere o sostituire espressioninan in un elenco, usa la comprensione degli elenchi, le condizionali (operatori ternari) e math.isnan(), numpy.isnan().

l = [float('nan'), 0, 1, 2]
print(l)
# [nan, 0, 1, 2]

print([x for x in l if not math.isnan(x)])
# [0, 1, 2]

print([-100 if math.isnan(x) else x for x in l])
# [-100, 0, 1, 2]

Basta usare math.isnan() e numpy.isnan() per controllo e il concetto è lo stesso degli altri casi di rimozione e di valori. Vedere il seguente articolo per i dettagli.

Vedi i seguenti articoli su come rimuovere e sostituire nan in NumPy e panda.

Operazioni con nan

Operazioni come +, -, *, / e ** con nan risultato nan.

print(float('nan') + 100)
# nan

print(float('nan') - 100)
# nan

print(float('nan') - 100)
# nan

print(float('nan') / 100)
# nan

print(float('nan') ** 100)
# nan