2017-01-04 5 views
10

Ich lerne gerade Python/Pandas und mag, wie mächtig und prägnant es ist.Mit Regex übereinstimmende Gruppen in Pandas Dataframe ersetzen Funktion

Während der Datenbereinigung möchte ich ersetzen auf eine Spalte in einem Datenrahmen mit Regex, aber ich möchte Teile der Übereinstimmung (Gruppen) einfügen.

Einfaches Beispiel: Nachname, Vorname -> Vorname Nachname

Ich habe versucht, so etwas wie die folgende (tatsächlicher Fall ist komplexer, so die einfache regex entschuldigen):

df['Col1'].replace({'([A-Za-z])+, ([A-Za-z]+)' : '\2 \1'}, inplace=True, regex=True) 

Dies führt jedoch in leere Werte. Der Übereinstimmungsteil funktioniert wie erwartet, der Wertteil jedoch nicht. Ich denke, dass dies durch einige Spaltung und Zusammenführung erreicht werden könnte, aber ich suche nach einer allgemeinen Antwort, ob die Regex-Gruppe ersetzt werden kann.

+1

Bitte, einige Daten zum Testen teilen. – Abdou

+0

oder 'df ['Col1']. Ersetze ({'([A-Za-z] +), ([A-Za-z] +)': '\\ 2 \\ 1'}, inplace = Wahr , Regex = True) '. – Abdou

+0

Wirklich toll! Ich lerne gerade Python, entschuldige bitte den Anfängerfehler. Zusätzliche Frage: Beide Möglichkeiten Broadcast, d. H. Sind die beiden schnell, die über .str und die mit replace() direkt? –

Antwort

7

Ich glaube, Sie ein paar Probleme mit der RegEx ist haben.

Als @Abdou just said Verwendung entweder '\\2 \\1' oder besser r'\2 \1', wie '\1' ist ein Symbol mit ASCII-Code 1

Ihre Lösung sollte funktionieren, wenn Sie richtig RegEx die verwenden:

In [193]: df 
Out[193]: 
       name 
0  John, Doe 
1 Max, Mustermann 

In [194]: df.name.replace({r'(\w+),\s+(\w+)' : r'\2 \1'}, regex=True) 
Out[194]: 
0   Doe John 
1 Mustermann Max 
Name: name, dtype: object 

In [195]: df.name.replace({r'(\w+),\s+(\w+)' : r'\2 \1', 'Max':'Fritz'}, regex=True) 
Out[195]: 
0   Doe John 
1 Mustermann Fritz 
Name: name, dtype: object 
+0

Danke, vor allem für die nette Erklärung, wie Python Regex funktioniert, Die meisten Beispiele, die ich gesehen habe, sind so einfach, dass sie die r-Syntax ohne Probleme weglassen können, so scheint es. –

5

Setup

df = pd.DataFrame(dict(name=['Smith, Sean'])) 
print(df) 

      name 
0 Smith, Sean 

Verwendung replace

df.name.str.replace(r'(\w+),\s*(\w+)', r'\2 \1') 

0 Sean Smith 
Name: name, dtype: object 

extract Verwendung
Split auf zwei Säulen

df.name.str.extract('(?P<Last>\w+),\s*(?P<First>\w+)', expand=True) 

    Last First 
0 Smith Sean 
+0

Danke für die zusätzlichen Informationen über extract(), piRSquared. Ich habe die Antwort von MaxU für den zusätzlichen Hinweis auf meinen Anfängerfehler mit Regex markiert. –

+0

@PeterD kein Problem. MaxU's Antwort ist großartig – piRSquared

Verwandte Themen