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.