Pandas Fillna mehrere Spalten

Salman Mehmood 21 Juni 2023
Pandas Fillna mehrere Spalten

Dieser Artikel erklärt, wie Sie die Funktion fillna() verwenden, um die NaN-Werte durch numerische zu ersetzen. Wir werden auch lernen, wie man die NaN-Werte aus dem Pandas-Datenrahmen durch Strings ersetzt.

Ersetzen Sie mehrere Spalten mit NaN-Werten durch einen beliebigen Datentyp mit fillna() in Pandas

Die Pandas-Funktion fillna() kann die NaN-Werte durch einen bestimmten Wert ersetzen. Die Funktion kann diesen Wert innerhalb einer Spalte oder Zeile propagieren oder NaN-Werte je nach Spalte durch andere Werte ersetzen.

Wir erstellen ein neues Skript mit der als pd importierten Pandas-Bibliothek, gefolgt von der als np importierten NumPy-Bibliothek. Als nächstes erstellen wir einen neuen Datenrahmen namens City_Temp und setzen diesen gleich dem Pandas-Datenrahmen.

Nehmen wir an, wir verfolgen die Temperaturen für 2 Städte, Tulsa und Dallas, für eine Woche, aber die Daten sind unvollständig. Wir erstellen zwei Datenreihen mit Temperaturwerten für jede Stadt für 5 Tage.

Die erste Zeile enthält den Schlüssel von Tulsa mit einigen numerischen Werten und np.nan innerhalb einer Liste, und die zweite Zeile mit dem Schlüssel von Dallas enthält auch einige numerische Werte und np.nan. Der Wert np.nan erzeugt einen Nullwert im Datenrahmen.

Als nächstes fügen wir das Argument index mit einer Liste mit den abgekürzten Namen von Montag bis Freitag hinzu. Wenn das Ergebnis auf der Konsole ausgegeben wird, sehen wir einen Datenrahmen mit Temperaturwerten für zwei Städte über 5 verschiedene Tage.

import numpy as np
import pandas as pd

City_Temp = pd.DataFrame(
    {
        "Tulsa": [78.5, 80.0, 75.1, np.nan, np.nan],
        "Dallas": [83.2, 93.1, np.nan, np.nan, 92.1],
    },
    index=["Mon", "Tue", "Wed", "Thu", "Fri"],
)

print(City_Temp)

Ausgang:

     Tulsa  Dallas
Mon   78.5    83.2
Tue   80.0    93.1
Wed   75.1     NaN
Thu    NaN     NaN
Fri    NaN    92.1

Um die leeren Werte innerhalb des City_Temp-Datenrahmens zu füllen, können wir die fillna()-Funktion von Pandas innerhalb einer print-Anweisung verwenden. In der Funktion fillna() fügen wir einen einzelnen Wert von 80.0 hinzu, und wenn das Ergebnis auf der Konsole ausgegeben wird, sehen wir, dass alle NaN-Werte aus dem Datenrahmen durch die Zahl 80.0 ersetzt wurden.

print(City_Temp.fillna(80.0))

Ausgang:

     Tulsa  Dallas
Mon   78.5    83.2
Tue   80.0    93.1
Wed   75.1    80.0
Thu   80.0    80.0
Fri   80.0    92.1

Als Alternative zur Angabe eines bestimmten Werts können wir das Argument method mit dem Wert ffill verwenden, um die Funktion anzuweisen, die NaN-Werte mit dem Wert darüber in derselben Spalte zu füllen. Dabei werden die NaN-Werte für Tulsa durch 75.1 und die Werte für Dallas durch 93.1 ersetzt.

print(City_Temp.fillna(method="ffill"))

Ausgang:

     Tulsa  Dallas
Mon   78.5    83.2
Tue   80.0    93.1
Wed   75.1    93.1
Thu   75.1    93.1
Fri   75.1    92.1

Auf ähnliche Weise können wir ein Backfill durchführen, wenn der Wert des Arguments method auf bfill gesetzt ist. Das Ergebnis zeigt, dass die NaN-Werte in der Spalte Dallas mit dem Wert 92.1 gefüllt sind, aber die Werte in der Spalte Tulsa nicht ersetzt werden.

Dies liegt daran, dass unterhalb der Zeile Friday kein gültiger Wert vorhanden ist, der zum Ersetzen der NaN-Werte verwendet werden kann.

print(City_Temp.fillna(method="bfill"))

Ausgang:

     Tulsa  Dallas
Mon   78.5    83.2
Tue   80.0    93.1
Wed   75.1    92.1
Thu    NaN    92.1
Fri    NaN    92.1

Wenn wir das erste NaN-Elementvorkommen im Datenrahmen für jede Stadt füllen möchten, können wir den ffil-Wert für den method-Typ verwenden und das limit-Argument mit einem Wert von 1 hinzufügen. Das Ergebnis zeigt dies nur das erste Vorkommen des NaN-Wertes wird durch eine Vorwärtsfüllung ersetzt.

print(City_Temp.fillna(method="ffill", limit=1))

Ausgang:

     Tulsa  Dallas
Mon   78.5    83.2
Tue   80.0    93.1
Wed   75.1    93.1
Thu   75.1     NaN
Fri    NaN    92.1

Füllen Sie die NaN-Elemente mit dem Durchschnitt

Schliesslich können wir in verschiedenen Spalten unterschiedliche Werte für die NaN-Elemente angeben.

Nehmen wir an, wir wollen die NaN-Elemente mit dem durchschnittlichen Temperaturwert für diese Stadt füllen. Dazu erstellen wir ein Wörterbuch mit geschweiften Klammern innerhalb der Funktion fillna().

Im Wörterbuch fügen wir den Schlüssel Tulsa mit dem auf 2 Dezimalstellen gerundeten durchschnittlichen Temperaturwert hinzu, indem wir die Funktion np.round() mit der darin enthaltenen Funktion np.mean() verwenden.

Innerhalb der Funktion mean() fügen wir den Datenrahmen City_Temp als erstes Argument hinzu und geben die Spalte Tulsa in eckigen Klammern an, gefolgt von der Ganzzahl 2, um das Ergebnis auf 2 Dezimalstellen zu runden. Dies wird für das Schlüssel-Wert-Paar Dallas wiederholt.

Wir können den Datenrahmen neu zuweisen, sodass er dauerhaft geändert wird.

City_Temp = City_Temp.fillna(
    {
        "Tulsa": np.round(np.mean(City_Temp["Tulsa"]), 2),
        "Dallas": np.round(np.mean(City_Temp["Dallas"]), 2),
    }
)
print(City_Temp)

Wenn das Ergebnis auf der Konsole ausgegeben wird, sehen wir, dass der Durchschnittswert für Tulsa, 77,87, die NaN-Elemente für Donnerstag und Freitag ersetzt hat, und der Durchschnittswert für Dallas, 89,47, die NaN-Elemente für Mittwoch ersetzt hat und Donnerstag.

     Tulsa  Dallas
Mon  78.50   83.20
Tue  80.00   93.10
Wed  75.10   89.47
Thu  77.87   89.47
Fri  77.87   92.10

Ersetzen Sie die NaN-Werte durch einen String

In Ihrem Fall könnte der Datentyp beliebig sein, aber in diesem Fall können Sie auch den NaN-Wert oder den Nullwert mit dem folgenden Code ersetzen.

City_Temp = pd.DataFrame(
    {
        "Tulsa": [78.5, 80.0, 75.1, np.nan, np.nan],
        "Dallas": [83.2, 93.1, np.nan, np.nan, 92.1],
    },
    index=["Mon", "Tue", "Wed", "Thu", "Fri"],
)

print(City_Temp)

Ausgang:

     Tulsa  Dallas
Mon   78.5    83.2
Tue   80.0    93.1
Wed   75.1     NaN
Thu    NaN     NaN
Fri    NaN    92.1

Betrachten Sie den folgenden Code, um die NaN-Werte durch eine Zeichenfolge zu ersetzen.

df = City_Temp.fillna({"Tulsa": ".", "Dallas": "."}).fillna(0)
print(df)

Ausgang:

    Tulsa Dallas
Mon  78.5   83.2
Tue  80.0   93.1
Wed  75.1      .
Thu     .      .
Fri     .   92.1

Wir können auch das folgende Code-Snippet verwenden, um die NaN-Werte durch eine Zeichenfolge zu ersetzen, was genauso funktioniert wie der oben erwähnte Code.

print(City_Temp.fillna("."))

Ausgang:

    Tulsa Dallas
Mon  78.5   83.2
Tue  80.0   93.1
Wed  75.1      .
Thu     .      .
Fri     .   92.1

Vollständiger Code:

# In[1]:

import numpy as np
import pandas as pd

City_Temp = pd.DataFrame(
    {
        "Tulsa": [78.5, 80.0, 75.1, np.nan, np.nan],
        "Dallas": [83.2, 93.1, np.nan, np.nan, 92.1],
    },
    index=["Mon", "Tue", "Wed", "Thu", "Fri"],
)

print(City_Temp)

# In[2]:

print(City_Temp.fillna(80.0))

# In[3]:

print(City_Temp.fillna(method="ffill"))

# In[4]:

print(City_Temp.fillna(method="bfill"))

# In[5]:

print(City_Temp.fillna(method="ffill", limit=1))

# In[6]:

City_Temp = City_Temp.fillna(
    {
        "Tulsa": np.round(np.mean(City_Temp["Tulsa"]), 2),
        "Dallas": np.round(np.mean(City_Temp["Dallas"]), 2),
    }
)
print(City_Temp)

# ##### Replace nan with string

# In[7]:

City_Temp = pd.DataFrame(
    {
        "Tulsa": [78.5, 80.0, 75.1, np.nan, np.nan],
        "Dallas": [83.2, 93.1, np.nan, np.nan, 92.1],
    },
    index=["Mon", "Tue", "Wed", "Thu", "Fri"],
)
print(City_Temp)

# In[8]:

df = City_Temp.fillna({"Tulsa": ".", "Dallas": "."}).fillna(0)
print(df)
# In[9]:
print(City_Temp.fillna("."))

Weitere Lösungen finden Sie hier.

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

Verwandter Artikel - Pandas Column