API · Pandas

Pandas DataFrame DataFrame.interpolate()-Funktion

Die Funktion DataFrame interpolate() füllt die NaN-Werte im DataFrame mit Hilfe der Interpolationstechnik.

Auf dieser Seite

Die Python-Pandas-Methode DataFrame.interpolate() schätzt fehlende Werte anhand benachbarter Werte entlang einer ausgewählten Achse. Eine Lücke im Inneren kann gefüllt werden, wenn sie von verwendbaren Werten umgeben ist. Fehlen ausreichende Informationen in den Daten, können Werte weiterhin fehlen. (NaN)

Syntax und Parameter von pandas.DataFrame.interpolate()

Der Methodenaufruf hat allgemein folgende Form:

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

Die Beispiele verwenden kleine numerische DataFrames, deren Eingabedaten Sie an Ihre eigenen Daten anpassen können.

Parameter Funktion
method Legt das Interpolationsverfahren fest. Dieser Artikel behandelt die Standardmethode linear und time. Welche Optionen Ihre installierte Version unterstützt, erfahren Sie in der pandas-API-Dokumentation.
axis Legt die Richtung der Interpolation fest: 0 arbeitet innerhalb jeder Spalte zeilenweise nach unten, 1 innerhalb jeder Zeile spaltenweise.
limit Gibt an, wie viele direkt aufeinanderfolgende fehlende Werte in einer Lücke höchstens gefüllt werden.
limit_direction Legt zusammen mit limit fest, ob das Füllen am Anfang ("forward"), am Ende ("backward") oder an beiden Enden ("both") einer Lücke beginnt.
inplace Bei True wird der ursprüngliche DataFrame geändert. Standardmäßig ist der Wert False.
limit_area Kann bei gesetztem limit zusätzlich einschränken, an welchen Stellen Werte gefüllt werden. In den Beispielen wird dieser Parameter nicht verwendet.
**kwargs Zusätzliche Schlüsselwortargumente, die das ausgewählte Interpolationsverfahren akzeptiert. Ihre Bedeutung hängt vom jeweiligen Verfahren ab.

Fehlende Werte mit der Standardmethode interpolieren

Bei der Standardoption method="linear" behandelt pandas die Positionen entlang der ausgewählten Achse als gleichmäßig verteilt. Im Beispiel wird der Wert zwischen 10 und 30 auf 20 geschätzt. Der abschließende fehlende Wert wird mit 30.0 gefüllt, indem der letzte bekannte Wert fortgeschrieben wird.

Führen Sie dieses Beispiel aus:

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

Verwenden Sie Interpolation, wenn ein fehlender Wert anhand benachbarter Beobachtungen geschätzt werden soll. pandas.DataFrame.fillna() ersetzt fehlende Werte dagegen durch einen festgelegten Wert oder mit einer anderen angegebenen Füllstrategie. Welche Methode passt, hängt von den Daten und der jeweiligen Aufgabe ab.

Ein Interpolationsverfahren auswählen

Lassen Sie method für gewöhnliche numerische Messwerte, deren Zeilenpositionen gleichmäßig verteilt sind, auf dem Standardwert. Bei einem zeitindizierten DataFrame berücksichtigt method="time" die durch den Index dargestellten Zeitabstände, um Werte zu schätzen. Das ist nützlich, wenn die Beobachtungen zeitlich nicht gleichmäßig verteilt sind. Das folgende zeitbasierte Beispiel zeigt die erforderliche Indexstruktur.

Die verfügbaren Verfahren und ihre Voraussetzungen können je nach pandas-Version variieren. Prüfen Sie die API-Dokumentation für Ihre Version, bevor Sie ein anderes Verfahren auswählen oder verfahrensspezifische Schlüsselwortargumente übergeben.

Die Interpolationsachse auswählen

Standardmäßig füllt axis=0 Werte innerhalb jeder Spalte zeilenweise nach unten. Mit axis=1 erfolgt das Füllen innerhalb jeder Zeile über die Spalten hinweg. Bei axis=1 wird beispielsweise ein fehlender Wert zwischen 10 und 30 in einer Zeile auf 20 geschätzt. Enthält eine Zeile keine bekannten Werte, gibt es keine Grundlage für eine Schätzung; ihre Einträge bleiben daher fehlend.

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

Der ausdrücklich angegebene numerische Datentyp sorgt außerdem dafür, dass eine vollständig fehlende Spalte numerisch bleibt und die Interpolation über die Zeile hinweg funktioniert. In diesem axis=1-Beispiel bestimmen die Positionen der Spalten und nicht ihre Namen den gleichmäßigen Abstand für die lineare Interpolation.

Aufeinanderfolgende fehlende Werte begrenzen und die Richtung festlegen

Mit limit legen Sie fest, wie viele direkt aufeinanderfolgende fehlende Einträge pandas in jeder Lücke höchstens füllt. limit_direction bestimmt zusammen mit dieser Obergrenze die Füllrichtung. Bei einer Lücke aus drei Werten zwischen 0 und 40 füllt limit=1 mit der Vorwärtsrichtung die erste fehlende Position von oben. Bei der Rückwärtsrichtung wird die letzte fehlende Position von unten gefüllt. Die übrigen fehlenden Positionen bleiben unverändert.

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

Verwenden Sie limit_direction="both", wenn das Füllen von beiden Enden aus sinnvoll ist. Prüfen Sie die resultierenden Daten, wenn eine Lücke länger als das festgelegte Limit ist.

Werte in zeitindizierten Daten interpolieren

Verwenden Sie für die Zeitinterpolation einen DatetimeIndex, damit die Datumsangaben und Zeitabstände Indexwerte sind und nicht als Zeichenfolgen in einer gewöhnlichen Spalte stehen. Der 2. Januar liegt zeitlich ein Drittel des Weges zwischen dem 1. und dem 4. Januar. Entsprechend liegt der interpolierte Wert ein Drittel des Weges zwischen 10 und 30 und ergibt 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

Behalten Sie bei der Zeitinterpolation den Datum-Zeit-Index bei. Werden die Datumsangaben in eine gewöhnliche Textspalte umgewandelt, stehen dem Verfahren die verwendeten Zeitabstände nicht zur Verfügung.

Rückgabewert und Verhalten mit inplace

Standardmäßig gibt DataFrame.interpolate() einen neuen DataFrame mit dem Interpolationsergebnis zurück; das ursprüngliche Objekt bleibt unverändert. Mit inplace=True wird der ursprüngliche DataFrame geändert und None zurückgegeben. Weisen Sie das Ergebnis daher nur bei Verwendung des Standardverhaltens einer Variable zu.

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

Der erste ausgegebene Wert ist None, der zweite der geänderte DataFrame.