2017-12-18 3 views
1

Ich muss einige Namensformate für die spätere Zusammenführung in meinem Skript anpassen. Meine Spalte 'Name' ist aus einer CSV importiert und enthält Namen wie die folgenden:Wie extrahiere ich Zeichen aus einer Zeichenfolge in Python?

Antonio Brown

LeSean McCoy

Le'Veon Bell

Für meinen Skript, würde ich gerne der erste Buchstabe des Vornamens und es mit dem Nachnamen als solche kombinieren ....

A.Brown

L.McCoy

L.Bell

Hier ist, was ich habe, dass gerade jetzt wieder eine Naan jedes Mal: ​​

ff['AbbrName'] = ff['Name'].str.extract('([A-Z]\s[a-zA-Z]+)', expand=True)

Dank!

+0

können Sie nicht mit apply() eine Funktion ausführen, die es in zwei Wörter teilt und das erste Zeichen vom ersten Wort plus zweites Wort erhält. – furas

+0

Wie wäre es '.split ('')'? –

+0

Wenn Ihre Frage beantwortet wurde, stimmen Sie bitte mit [stimme ab und akzeptieren Sie den hilfreichsten] (https://meta.stackexchange.com/a/5235). Vielen Dank. –

Antwort

7

Eine weitere Option unter Verwendung von str.replace Verfahren mit ^([A-Z]).*?([a-zA-Z]+)$; ^([A-Z]) erfasst den ersten Buchstaben am Anfang der Zeichenfolge; ([a-zA-Z]+)$ das letzte Wort übereinstimmt, dann den Namen rekonstruieren, indem . zwischen der ersten erfassten Gruppe hinzufügen und zweiten erfassten Gruppe:

df['Name'].str.replace(r'^([A-Z]).*?([a-zA-Z]+)$', r'\1.\2') 
#0 A.Brown 
#1 L.McCoy 
#2  L.Bell 
#Name: Name, dtype: object 
+1

Ist Regex wirklich notwendig hier? –

+0

@COLDSPEED Ich tendiere dazu, Regex als gültig zu betrachten, da OP sich mit Namen beschäftigt und es ist nicht überraschend, dass es unerwartete Formate in einem realen Datensatz gibt. 'Regex' hilft, den Namen ebenfalls zu validieren. – Psidom

4

Was passiert, wenn man es nur apply() eine Funktion, die durch den ersten Raum und erhalten Sie die ersten Buchstaben des ersten Wortes Hinzufügen der Rest aufgeteilt würde:

import pandas as pd 


def abbreviate(row): 
    first_word, rest = row['Name'].split(" ", 1) 
    return first_word[0] + ". " + rest 


df = pd.DataFrame({'Name': ['Antonio Brown', 'LeSean McCoy', "Le'Veon Bell"]}) 
df['AbbrName'] = df.apply(abbreviate, axis=1) 
print(df) 

Drucke:

  Name AbbrName 
0 Antonio Brown A. Brown 
1 LeSean McCoy L. McCoy 
2 Le'Veon Bell L. Bell 
+0

Manchmal ist vielleicht nur der Vorname in der Spalte Name richtig? – Dark

+0

@Dark yeah, ich denke, wir müssen wissen, was die möglichen Werte für die Namen im speziellen Fall des OP sind, aber guter Punkt, können wir einige Eingänge schaffen, um die Lösung zu brechen. Vielen Dank. – alecxe

0

Sie erhalten Naan, weil Ihr regulärer Ausdruck nicht auf die Namen übereinstimmen kann.

Stattdessen werde ich versuchen Sie folgendes:

parts = ff[name].split(' ') 
ff['AbbrName'] = parts[0][0] + '.' + parts[1] 
+0

Das funktioniert nicht? –

2

Dieses einfach genug sein sollte, auch ohne Regex zu tun. Verwenden Sie eine Kombination aus String-Splitting und Verkettung.

df.Name.str[0] + '.' + df.Name.str.split().str[-1] 

0 A.Brown 
1 L.McCoy 
2  L.Bell 
Name: Name, dtype: object 

Wenn die Möglichkeit der Name Säule ist mit führenden Leerzeichen ersetzen df.Name.str[0] mit df.Name.str.strip().str[0].

Vorbehalt: Spalten müssen mindestens zwei Namen haben.

Verwandte Themen