API · Pandas

Pandas DataFrame DataFrame.interpolate() Função

A função DataFrame interpolate() preenche valores NaN no DataFrame usando a técnica de interpolação.

Nesta página

O Python Pandas DataFrame.interpolate() estima valores ausentes a partir dos valores vizinhos ao longo de um eixo escolhido. Ele pode preencher uma lacuna interna quando há valores utilizáveis dos dois lados; alguns valores podem continuar ausentes quando os dados não fornecem informações suficientes. (NaN)

Sintaxe e parâmetros de pandas.DataFrame.interpolate()

A chamada do método tem esta forma geral:

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

Os exemplos usam DataFrames numéricos pequenos, para que você possa adaptar as entradas aos seus próprios dados.

Parâmetro O que controla
method A abordagem de interpolação. Este artigo aborda o método padrão linear e o método time; consulte a documentação da API do pandas para ver as opções compatíveis com a versão instalada.
axis A direção da interpolação: 0 percorre as linhas dentro de cada coluna, enquanto 1 percorre as colunas dentro de cada linha.
limit O número máximo de valores ausentes consecutivos a preencher em uma lacuna.
limit_direction Com limit, define se o preenchimento começa no início ("forward"), no fim ("backward") ou nas duas extremidades ("both") da lacuna.
inplace Se for True, modifica o DataFrame original. O padrão é False.
limit_area Uma restrição opcional sobre onde os valores são preenchidos quando limit está definido. Ela não aparece nos exemplos deste artigo.
**kwargs Argumentos nomeados adicionais aceitos pelo método de interpolação selecionado. O significado depende desse método.

Interpolar valores ausentes com o método padrão

Com o padrão method="linear", o pandas estima valores considerando igualmente espaçadas as posições ao longo do eixo selecionado. No exemplo, o valor entre 10 e 30 é estimado como 20, e o valor ausente no final é preenchido com 30.0, propagando o último valor conhecido.

Execute este exemplo:

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

Use a interpolação quando o valor ausente deve ser estimado a partir de observações próximas. pandas.DataFrame.fillna(), por sua vez, substitui valores ausentes por um valor escolhido ou por outra estratégia de preenchimento especificada. A operação mais adequada depende dos dados e do objetivo.

Escolher um método de interpolação

Mantenha method no padrão para medições numéricas comuns cujas posições nas linhas estejam igualmente espaçadas. Em um DataFrame indexado por tempo, method="time" usa os intervalos representados pelo índice para estimar valores. Isso é útil quando as observações não estão igualmente espaçadas no tempo. O exemplo baseado em tempo abaixo mostra o formato de índice necessário.

Os métodos disponíveis e seus requisitos podem variar conforme a versão do pandas. Consulte a documentação da API correspondente à versão usada antes de escolher outro método ou passar argumentos nomeados específicos do método.

Escolher o eixo de interpolação

O padrão axis=0 preenche cada coluna de cima para baixo. Defina axis=1 para preencher as colunas dentro de cada linha. Por exemplo, com axis=1, um valor ausente entre 10 e 30 em uma linha é estimado como 20. Se uma linha não contiver valores conhecidos, não haverá valores para estimar a partir deles, e suas entradas continuarão ausentes.

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

O tipo numérico explícito também mantém como numérica uma coluna inteiramente ausente, permitindo que a interpolação ao longo da linha funcione. Neste exemplo com axis=1, são as posições das colunas, e não seus nomes, que determinam o espaçamento linear.

Limitar valores ausentes consecutivos e definir a direção

Defina limit para restringir quantas entradas ausentes consecutivas o pandas preenche em cada lacuna. limit_direction controla a direção usada com esse limite. Em uma lacuna de três valores entre 0 e 40, limit=1 com preenchimento para a frente preenche a primeira posição ausente, a partir de cima; com preenchimento para trás, preenche a última posição ausente, a partir de baixo. As outras posições continuam ausentes.

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

Use limit_direction="both" quando for adequado preencher a partir das duas extremidades e examine os dados resultantes se a lacuna for maior que o limite.

Interpolar valores em dados indexados por tempo

Para interpolar com base no tempo, use um DatetimeIndex, de modo que as datas e o tempo decorrido sejam valores do índice, e não strings em uma coluna comum. O dia 2 de janeiro está a um terço do intervalo entre 1º e 4 de janeiro. Portanto, o valor interpolado também fica a um terço do intervalo entre 10 e 30, resultando em 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

Mantenha o índice de data e hora ao usar a interpolação por tempo; converter as datas em uma coluna de texto comum não fornece os intervalos temporais usados pelo método.

Valor retornado e comportamento de alteração no próprio objeto

Por padrão, DataFrame.interpolate() retorna um novo DataFrame com o resultado da interpolação e deixa o objeto original inalterado. Com inplace=True, modifica o DataFrame original e retorna None; portanto, atribua o resultado somente ao usar o comportamento padrão.

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

O primeiro valor exibido é None; o segundo é o DataFrame modificado.