Hinzufügen, Ändern und Löschen von Daten

Bei vielen Datensätzen möchtet ihr vielleicht eine Transformation basierend auf den Werten in einem Array, einer Serie oder einer Spalte in einem DataFrame durchführen. Hierfür betrachten wir die ersten Unicode-Zeichen:

[1]:
import numpy as np
import pandas as pd
[2]:
df = pd.DataFrame(
    {
        "Code": ["U+0000", "U+0001", "U+0002", "U+0003", "U+0004", "U+0005"],
        "Decimal": [0, 1, 2, 3, 4, 5],
        "Octal": ["001", "002", "003", "004", "004", "005"],
        "Key": ["NUL", "Ctrl-A", "Ctrl-B", "Ctrl-C", "Ctrl-D", "Ctrl-E"],
    }
)

df
[2]:
Code Decimal Octal Key
0 U+0000 0 001 NUL
1 U+0001 1 002 Ctrl-A
2 U+0002 2 003 Ctrl-B
3 U+0003 3 004 Ctrl-C
4 U+0004 4 004 Ctrl-D
5 U+0005 5 005 Ctrl-E

Daten hinzufügen

Angenommen, ihr möchtet eine Spalte hinzufügen, in der die Zeichen dem C0- oder C1-Steuercode zugewiesen werden:

[3]:
control_code = {
    "u+0000": "C0",
    "u+0001": "C0",
    "u+0002": "C0",
    "u+0003": "C0",
    "u+0004": "C0",
    "u+0005": "C0",
}

Die map-Methode für eine Serie akzeptiert eine Funktion oder ein diktatähnliches Objekt, das eine Zuordnung enthält, aber hier haben wir ein kleines Problem, da einige die Codes in control_code kleingeschrieben sind, nicht jedoch in unserem DataFrame. Daher müssen wir jeden Wert mit der Methode str.lower in Kleinbuchstaben umwandeln:

[4]:
lowercased = df["Code"].str.lower()

lowercased
[4]:
0    u+0000
1    u+0001
2    u+0002
3    u+0003
4    u+0004
5    u+0005
Name: Code, dtype: object
[5]:
df["Control code"] = lowercased.map(control_code)

df
[5]:
Code Decimal Octal Key Control code
0 U+0000 0 001 NUL C0
1 U+0001 1 002 Ctrl-A C0
2 U+0002 2 003 Ctrl-B C0
3 U+0003 3 004 Ctrl-C C0
4 U+0004 4 004 Ctrl-D C0
5 U+0005 5 005 Ctrl-E C0

Wir hätten auch eine Funktion übergeben können, die die ganze Arbeit erledigt:

[6]:
df["Code"].map(lambda x: control_code[x.lower()])
[6]:
0    C0
1    C0
2    C0
3    C0
4    C0
5    C0
Name: Code, dtype: object

Die Verwendung von map ist ein bequemer Weg, um elementweise Transformationen und andere Datenbereinigungsoperationen durchzuführen.

Daten ändern

Hinweis

Das Ersetzen fehlender Werte wird in Verwalten fehlender Daten mit pandas beschrieben.

[7]:
pd.Series(["Manpower", "man-made"]).str.replace("Man", "Personal", regex=False)
[7]:
0    Personalpower
1         man-made
dtype: object
[8]:
pd.Series(["Man-Power", "man-made"]).str.replace(
    "[Mm]an", "Personal", regex=True
)
[8]:
0    Personal-Power
1     Personal-made
dtype: object

Hinweis

Die Methode replace unterscheidet sich von str.replace, dadurch, dass diese elementweise Zeichenketten ersetzt.

Daten löschen

Einen oder mehrere Einträge aus einer Achse zu löschen ist einfach, wenn ihr bereits ein Index-Array oder eine Liste ohne diese Einträge habt.

Zum Löschen von Duplikaten siehe Daten deduplizieren.

Da dies ein wenig Mengenlehre erfordern kann, geben wir die Drop-Methode als neues Objekt ohne den oder die gelöschten Werten zurück:

[9]:
s = pd.Series(np.random.randn(7))

s
[9]:
0   -1.200837
1    2.444208
2   -0.948290
3   -1.409449
4   -2.220925
5    0.494626
6    0.589888
dtype: float64
[10]:
new = s.drop(2)

new
[10]:
0   -1.200837
1    2.444208
3   -1.409449
4   -2.220925
5    0.494626
6    0.589888
dtype: float64
[11]:
new = s.drop([2, 3])

new
[11]:
0   -1.200837
1    2.444208
4   -2.220925
5    0.494626
6    0.589888
dtype: float64

Bei DataFrames können Indexwerte auf beiden Achsen gelöscht werden. Um dies zu veranschaulichen, erstellen wir zunächst einen Beispiel-DataFrame:

[12]:
data = {
    "Code": ["U+0000", "U+0001", "U+0002", "U+0003", "U+0004", "U+0005"],
    "Decimal": [0, 1, 2, 3, 4, 5],
    "Octal": ["001", "002", "003", "004", "004", "005"],
    "Key": ["NUL", "Ctrl-A", "Ctrl-B", "Ctrl-C", "Ctrl-D", "Ctrl-E"],
}

df = pd.DataFrame(data)

df
[12]:
Code Decimal Octal Key
0 U+0000 0 001 NUL
1 U+0001 1 002 Ctrl-A
2 U+0002 2 003 Ctrl-B
3 U+0003 3 004 Ctrl-C
4 U+0004 4 004 Ctrl-D
5 U+0005 5 005 Ctrl-E
[13]:
df.drop([0, 1])
[13]:
Code Decimal Octal Key
2 U+0002 2 003 Ctrl-B
3 U+0003 3 004 Ctrl-C
4 U+0004 4 004 Ctrl-D
5 U+0005 5 005 Ctrl-E

Ihr könnt auch Werte aus den Spalten entfernen, indem ihr axis=1 oder axis='columns' übergebt:

[14]:
df.drop("Decimal", axis=1)
[14]:
Code Octal Key
0 U+0000 001 NUL
1 U+0001 002 Ctrl-A
2 U+0002 003 Ctrl-B
3 U+0003 004 Ctrl-C
4 U+0004 004 Ctrl-D
5 U+0005 005 Ctrl-E

Viele Funktionen wie drop, die die Größe oder Form einer Reihe oder eines DataFrame ändern, können ein Objekt an Ort und Stelle manipulieren, ohne ein neues Objekt zurückzugeben:

[15]:
df.drop(0, inplace=True)

df
[15]:
Code Decimal Octal Key
1 U+0001 1 002 Ctrl-A
2 U+0002 2 003 Ctrl-B
3 U+0003 3 004 Ctrl-C
4 U+0004 4 004 Ctrl-D
5 U+0005 5 005 Ctrl-E

Warnung

Seid vorsichtig mit der inplace-Funktion, da die Daten unwiderbringlich gelöscht werden.