API · Pandas

Pandas DataFrame Funzione DataFrame.interpolate()

La funzione DataFrame interpolate() riempie i valori NaN nel DataFrame utilizzando la tecnica di interpolazione.

In questa pagina

La funzione Python Pandas DataFrame.interpolate() stima i valori mancanti a partire dai valori vicini lungo un asse scelto. Può colmare una lacuna interna quando è circondata da valori utilizzabili; alcuni valori possono restare mancanti se i dati non forniscono informazioni sufficienti. (NaN)

Sintassi e parametri di pandas.DataFrame.interpolate()

La chiamata al metodo ha questa forma generale:

DataFrame.interpolate(method="linear", axis=0, limit=None, inplace=False, limit_direction="forward", limit_area=None, **kwargs)

Gli esempi usano DataFrame numerici di piccole dimensioni, così puoi adattare i dati di input ai tuoi dati.

Parametro A cosa serve
method Il metodo di interpolazione. Questo articolo tratta il metodo predefinito linear e time; consulta la documentazione dell’API pandas per le opzioni supportate dalla versione installata.
axis La direzione dell’interpolazione: 0 procede dall’alto verso il basso nelle righe di ciascuna colonna, mentre 1 procede tra le colonne di ciascuna riga.
limit Il numero massimo di valori mancanti consecutivi da colmare in una lacuna.
limit_direction Insieme a limit, permette di scegliere se il riempimento procede dall’inizio ("forward"), dalla fine ("backward") o da entrambe le estremità ("both") della lacuna.
inplace Se è True, modifica il DataFrame originale. Il valore predefinito è False.
limit_area Una restrizione facoltativa sulle posizioni da riempire quando è impostato limit. Non viene usata negli esempi di questo articolo.
**kwargs Altri argomenti con nome accettati dal metodo di interpolazione selezionato. Il loro significato dipende dal metodo.

Interpolare i valori mancanti con il metodo predefinito

Con il valore predefinito method="linear", pandas stima i valori considerando equidistanti le posizioni lungo l’asse selezionato. Nell’esempio, il valore tra 10 e 30 viene stimato come 20 e il valore mancante finale viene sostituito con 30.0, propagando in avanti l’ultimo valore noto.

Esegui questo esempio:

import pandas as pd

df = pd.DataFrame({"temperature": [10.0, None, 30.0, None]})
result = df.interpolate()
print(result)
   temperature
0         10.0
1         20.0
2         30.0
3         30.0

Usa l’interpolazione quando vuoi stimare un valore mancante a partire dalle osservazioni vicine. pandas.DataFrame.fillna() invece sostituisce i valori mancanti con un valore scelto o con un’altra strategia di riempimento specificata; l’operazione più adatta dipende dai dati e dall’obiettivo.

Scegliere un metodo di interpolazione

Per misurazioni numeriche ordinarie con posizioni di riga equidistanti, lascia method al suo valore predefinito. In un DataFrame indicizzato per tempo, method="time" usa gli intervalli temporali rappresentati nell’indice per stimare i valori. È utile quando le osservazioni non sono equidistanti nel tempo. L’esempio basato sul tempo qui sotto mostra la struttura di indice richiesta.

I metodi disponibili e i relativi requisiti possono variare in base alla versione di pandas. Prima di scegliere un altro metodo o di passare argomenti con nome specifici per quel metodo, consulta la documentazione dell’API relativa alla versione in uso.

Scegliere l’asse di interpolazione

Il valore predefinito axis=0 riempie i valori procedendo dall’alto verso il basso in ciascuna colonna. Imposta axis=1 per procedere tra le colonne di ogni riga. Per esempio, con axis=1, un valore mancante tra 10 e 30 nella stessa riga viene stimato come 20. Se una riga non contiene valori noti, l’interpolazione non ha valori da cui ricavare una stima e lascia mancanti le sue voci.

import pandas as pd

df = pd.DataFrame(
    {"morning": [10.0, None], "afternoon": [None, None], "evening": [30.0, None]},
    dtype="float64",
)
print(df.interpolate(axis=1))
   morning  afternoon  evening
0     10.0       20.0     30.0
1      NaN        NaN      NaN

Il tipo numerico specificato esplicitamente mantiene numerica anche una colonna interamente mancante, così l’interpolazione tra le colonne della riga riesce. In questo esempio con axis=1, la spaziatura lineare dipende dalle posizioni delle colonne, non dai loro nomi.

Limitare i valori mancanti consecutivi e impostarne la direzione

Imposta limit per stabilire quanti valori mancanti consecutivi pandas può riempire in ciascuna lacuna. limit_direction controlla la direzione del riempimento entro questo limite. In una lacuna di tre valori tra 0 e 40, limit=1 con riempimento in avanti colma la prima posizione mancante dall’alto; con il riempimento all’indietro colma l’ultima posizione mancante dal basso. Le altre posizioni restano mancanti.

import pandas as pd

df = pd.DataFrame({"reading": [0.0, None, None, None, 40.0]})
print("Forward:")
print(df.interpolate(limit=1, limit_direction="forward"))
print("Backward:")
print(df.interpolate(limit=1, limit_direction="backward"))
Forward:
   reading
0      0.0
1     10.0
2      NaN
3      NaN
4     40.0
Backward:
   reading
0      0.0
1      NaN
2      NaN
3     30.0
4     40.0

Usa limit_direction="both" quando è opportuno riempire da entrambe le estremità e controlla i dati risultanti se la lacuna supera il limite.

Interpolare i valori in dati indicizzati per tempo

Per interpolare in base al tempo, usa un DatetimeIndex, così le date e il tempo trascorso sono valori dell’indice anziché stringhe in una normale colonna. Il 2 gennaio si trova a un terzo della distanza tra il 1º gennaio e il 4 gennaio. Anche il valore interpolato è quindi a un terzo della distanza tra 10 e 30, pari a 16.666667.

import pandas as pd

index = pd.to_datetime(["2024-01-01", "2024-01-02", "2024-01-04"])
df = pd.DataFrame({"value": [10.0, None, 30.0]}, index=index)
print(df.interpolate(method="time"))
                value
2024-01-01  10.000000
2024-01-02  16.666667
2024-01-04  30.000000

Quando usi l’interpolazione basata sul tempo, mantieni l’indice di data e ora: convertire le date in una normale colonna di testo non fornisce gli intervalli temporali usati dal metodo.

Valore restituito e comportamento in-place

Per impostazione predefinita, DataFrame.interpolate() restituisce un nuovo DataFrame con il risultato dell’interpolazione e lascia invariato l’oggetto originale. Con inplace=True, modifica il DataFrame originale e restituisce None; assegna quindi il risultato solo quando usi il comportamento predefinito.

import pandas as pd

df = pd.DataFrame({"reading": [1.0, None, 3.0]})
result = df.interpolate(inplace=True)
print(result)
print(df)
   reading
0      1.0
1      2.0
2      3.0
   reading
0      1.0
1      2.0
2      3.0

Il primo valore stampato è None; il secondo è il DataFrame modificato.