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.083110
1 -0.073373
2 0.264559
3 0.211311
4 -0.385417
5 -0.811972
6 0.284811
dtype: float64
[10]:
new = s.drop(2)
new
[10]:
0 1.083110
1 -0.073373
3 0.211311
4 -0.385417
5 -0.811972
6 0.284811
dtype: float64
[11]:
new = s.drop([2, 3])
new
[11]:
0 1.083110
1 -0.073373
4 -0.385417
5 -0.811972
6 0.284811
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.