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 0.975612
1 0.375596
2 0.582852
3 -1.908045
4 -0.254497
5 0.499824
6 2.969355
dtype: float64
[10]:
new = s.drop(2)
new
[10]:
0 0.975612
1 0.375596
3 -1.908045
4 -0.254497
5 0.499824
6 2.969355
dtype: float64
[11]:
new = s.drop([2, 3])
new
[11]:
0 0.975612
1 0.375596
4 -0.254497
5 0.499824
6 2.969355
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.