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.