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.