Manipulation von Zeichenketten#
pandas bietet die Möglichkeit, String-Methoden und reguläre Ausdrücke von Python prägnant auf ganze Arrays von Daten anzuwenden.
Vektorisierte String-Funktionen in pandas#
Das Aufräumen eines unübersichtlichen Datensatzes für die Analyse erfordert oft eine Menge an String-Manipulationen. Erschwerend kommt hinzu, dass eine Spalte, die Strings enthält, manchmal fehlende Daten enthält:
[22]:
import pandas as pd
import numpy as np
addresses = {'Veit': np.nan, 'Veit Schiele': 'veit.schiele@cusy.io',
'cusy GmbH': 'info@cusy.io'}
addresses = pd.Series(addresses)
addresses
[22]:
Veit NaN
Veit Schiele veit.schiele@cusy.io
cusy GmbH info@cusy.io
dtype: object
[23]:
addresses.isna()
[23]:
Veit True
Veit Schiele False
cusy GmbH False
dtype: bool
Ihr könnt Methoden für Zeichenketten und reguläre Ausdrücke auf jeden Wert anwenden (durch Übergabe eines Lambdas oder einer anderen Funktion), indem ihr data.map
verwendet, aber dies schlägt bei NA
-Werten fehl. Um dies zu bewältigen, verfügt Series
über array-orientierte Methoden für String-Operationen, die NA
-Werte überspringen und weiterleiten. Auf diese wird über das str
-Attribut von Series
zugegriffen; zum Beispiel könnten wir mit str.contains
prüfen, ob jede
E-Mail-Adresse veit
enthält:
[24]:
addresses.str.contains('veit')
[24]:
Veit NaN
Veit Schiele True
cusy GmbH False
dtype: object
Reguläre Ausdrücke können ebenfalls verwendet werden, zusammen mit Optionen wie IGNORECASE
:
[25]:
pattern = r'([A-Z0-9._%+-]+)@([A-Z0-9.-]+)\.([A-Z]{2,4})'
addresses.str.findall(pattern, flags=re.IGNORECASE)
[25]:
Veit NaN
Veit Schiele [(veit.schiele, cusy, io)]
cusy GmbH [(info, cusy, io)]
dtype: object
Es gibt mehrere Möglichkeiten, ein vektorisiertes Element abzurufen. Entweder verwendet ihr str.get
oder den Index von str
:
[26]:
matches = addresses.str.findall(pattern, flags=re.IGNORECASE).str[0]
matches
[26]:
Veit NaN
Veit Schiele (veit.schiele, cusy, io)
cusy GmbH (info, cusy, io)
dtype: object
[27]:
matches.str.get(1)
[27]:
Veit NaN
Veit Schiele cusy
cusy GmbH cusy
dtype: object
In ähnlicher Weise könnt ihr mit dieser Syntax auch Zeichenketten zerschneiden:
[28]:
addresses.str[:5]
[28]:
Veit NaN
Veit Schiele veit.
cusy GmbH info@
dtype: object
Die pandas.Series.str.extract-Methode gibt die erfassten Gruppen eines regulären Ausdrucks als DataFrame zurück:
[29]:
addresses.str.extract(pattern, flags=re.IGNORECASE)
[29]:
0 | 1 | 2 | |
---|---|---|---|
Veit | NaN | NaN | NaN |
Veit Schiele | veit.schiele | cusy | io |
cusy GmbH | info | cusy | io |
Weitere vektorisierten Pandas-String-Methoden:
Methode |
Beschreibung |
---|---|
|
verknüpft Zeichenketten elementweise mit optionalem Trennzeichen |
|
gibt ein boolesches Array zurück, wenn jede Zeichenkette ein Muster/Regex enthält |
|
zählt Vorkommen des Musters |
|
verwendet einen regulären Ausdruck mit Gruppen, um eine oder mehrere Zeichenketten aus einer Reihe von Zeichenketten zu extrahieren; das Ergebnis ist ein DataFrame mit einer Spalte pro Gruppe |
|
Äquivalent zu |
|
Äquivalent zu |
|
berechnet Liste aller Vorkommen von Muster/Regex für jede Zeichenkette |
|
Index in jedem Element ( |
|
Äquivalent zu eingebautem |
|
Entspricht dem eingebauten |
|
Äquivalent zu eingebautem |
|
Gleichwertig zu eingebautem |
|
Gleichwertig zu eingebautem |
|
Gleichwertig zu eingebautem |
|
Äquivalent zur eingebauten |
|
verbindet Zeichenketten in jedem Element der Serie mit dem übergebenen Trennzeichen |
|
berechnet die Länge jeder Zeichenkette |
|
konvertiert Groß- und Kleinschreibung; entspricht |
|
verwendet |
|
erfasst Gruppenelemente (falls vorhanden) nach Index aus jeder Zeichenkette |
|
fügt Leerzeichen auf der linken, rechten oder beiden Seiten von Zeichenketten ein |
|
Äquivalent zu |
|
Doppelte Werte (z.B. |
|
ersetzt Muster/Regex durch eine andere Zeichenfolge |
|
schneidet jede Zeichenkette in der Serie auf |
|
teilt Zeichenketten anhand von Begrenzungszeichen oder regulären Ausdrücken |
|
schneidet Leerzeichen auf beiden Seiten ab, einschließlich Zeilenumbrüchen |
|
schneidet Leerzeichen auf der rechten Seite ab |
|
schneidet Leerzeichen auf der linken Seite ab |