2017-12-18 221 views
1

我需要使一些名稱格式匹配稍後在我的腳本中進行合併。我列「名稱」是從CSV導入幷包含類似名稱如下:如何從Python中的字符串中提取字符?

安東尼布朗

萊西恩·麥考伊

萊夫翁·貝爾

對於我的劇本,我想獲得第一個名字的第一個字母,並與姓氏結合起來這樣....

A.Brown

L.McCoy

L.Bell

這裏是我已經把現在返回一個烤餅每次:

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

謝謝!

+0

你不能使用apply()來執行將它分成兩個單詞的函數,並且從第一個單詞加上第二個單詞得到第一個字符。 – furas

+0

'.split('')'? –

+0

如果您的問題得到解答,請[投票,並接受最有幫助的](https://meta.stackexchange.com/a/5235)。謝謝。 –

回答

7

另一種選擇使用str.replace方法與^([A-Z]).*?([a-zA-Z]+)$; ^([A-Z])捕獲字符串開頭的第一個字母; ([a-zA-Z]+)$最後一個字相匹配,然後由第一捕獲組和第二組捕獲之間加入.重建名稱:

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

這裏正則表達式真的有必要嗎? –

+0

@COLDSPEED我傾向於認爲正則表達式在此處有效,因爲OP處理名稱,在真實數據集中出現意外格式並不奇怪。 'Regex'有助於驗證名稱。 – Psidom

4

如果你只想apply()將由第一空間分割,並獲得第一個字加入剩下的第一個字符的功能:

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) 

打印:

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

有時在名稱列中可能只有名字? – Dark

+0

@Dark是的,我想我們需要知道在OP的特定情況下名稱的可能值是什麼,但好處是,我們可以創建一些輸入來打破解決方案。謝謝。 – alecxe

0

你得到烤餅,因爲你的正則表達式無法比擬的名字。

相反,我會嘗試以下方法:

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

這不起作用? –

2

這應該是很簡單的事,即使沒有正則表達式。使用字符串拆分和串聯的組合。

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

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

如果在Name列具有前導空格的可能性,與df.Name.str.strip().str[0]更換df.Name.str[0]

警告:列最少必須有兩個名字。