2017-07-17 26 views
2

我有下面的代碼片段:有選擇地刪除空白字符串後在Python

import pandas as pd 

    df = pd.DataFrame([{'LastName':'VAN HOUTEN'}, 
         {'LastName':"O'BOYLE"}, 
         {'LastName':'ESTEVAN-GONZALEZ'}, 
         {'LastName':'RODRIGO TEIXEIRA'}, 
         {'LastName':'ESTEBAN GONZALEZ'}, 
         {'LastName':'O ROURKE'}, 
         {'LastName':'RODRIGO-TEIXEIRA'}]) 

    delete_space_after_list = ['VAN','O'] 

    df['NewName'] = df['LastName'].str.replace("'"," ") 

    for s in delete_space_after_list[:]: 
     df['NewName'] = df['NewName'].str.replace(s + ' ', s) 

    df['NewName'] = df['NewName'].str.replace('-'," ") 
    df['NewName'] = df['NewName'].str.split().str.get(0) 

運行這段代碼給我下面的結果:

Index  LastName    NewName 
    0   VAN HOUTEN    VANHOUTEN 
    1   O'BOYLE    OBOYLE 
    2   ESTEVAN-GONZALEZ  ESTEVAN 
    3   RODRIGO TEIXEIRA  RODRIGOTEIXEIRA 
    4   ESTEVAN GONZALEZ  ESTEVANGONZALEZ 
    5   O ROURKE    OROURKE 
    6   RODRIGO-TEIXEIRA  RODRIGO 

但是期望的輸出是這

Index  LastName    DesiredName 
    0   VAN HOUTEN    VANHOUTEN 
    1   O'BOYLE    OBOYLE 
    2   ESTEVAN-GONZALEZ  ESTEVAN 
    3   RODRIGO TEIXEIRA  RODRIGO 
    4   ESTEVAN GONZALEZ  ESTEVAN 
    5   O ROURKE    OROURKE 
    6   RODRIGO-TEIXEIRA  RODRIGO 

它消除了RODRIGO之後的空間(由於LastName末尾的'O')a將它與'TEIXEIRA'串聯起來,同樣消除ESTEVAN後的空間(因爲'0123'末尾的'VAN')並將其與'GONZALEZ'連接起來。但是,它正確地消除了其他名稱中的空間。

我如何獲得此代碼正確刪除空白,因爲它確實爲VAN HOUTEN,奧博伊爾,ESTEVAN岡薩雷斯,O- ROURKE,& RODRIGO-TEIXEIRA而ESTEVAN GONZALEZ & RODRIGO TEIXEIRA後不刪除空格?

回答

2

所以你要刪除的「少顯著」的名字,這是由一個在與OVAN但不OVAN結尾的名稱定義的,也除去非字母的其他名稱。

這對正則表達式的工作(或沒有他們一個長期的,痛苦的工作)

我會做到這一點的鏈接像這樣2個正則表達式(我離開大熊貓離開這裏,因爲這個問題沒有直接關係與熊貓):

data = [{'LastName':'VAN HOUTEN'}, 
         {'LastName':"O'BOYLE"}, 
         {'LastName':'ESTEVAN-GONZALEZ'}, 
         {'LastName':'RODRIGO TEIXEIRA'}, 
         {'LastName':'ESTEVAN GONZALEZ'}, # not ESTEBAN as in your example! 
         {'LastName':'O ROURKE'}, 
         {'LastName':'RODRIGO-TEIXEIRA'}] 

import re 

new_data = [re.sub("\W","",re.sub("(.)(O|VAN)\W.*",r"\1\2",v['LastName'])) for v in data] 

print(new_data) 

結果:

['VANHOUTEN', 'OBOYLE', 'ESTEVAN', 'RODRIGO', 'ESTEVAN', 'OROURKE', 'RODRIGO'] 

這樣:

  • "(.)(O|VAN)\W.*"匹配至少一個字符,後跟OVAN前綴,後跟一個非字母(\W),其餘的,我們跳過(我們只保留2個第一組):在處理「少顯著名「
  • "\W"刪除空格,破折號,引號......全部非字母數字。比處理第二種情況。
1

一個熊貓解決方案,正則表達式不像Jean-FrançoisFabre那樣乾淨,但它的工作原理。

In [541]: import operator 

In [542]: df['LastName'].transform(lambda x: x.replace("[-']", ' ', regex=True) \ 
    ...:          .replace(r'^((?:O)|(?:VAN)) ', r'\1', regex=True) \ 
    ...:          .str.split()) \ 
    ...:    .map(operator.itemgetter(0)) 
    ...: 
Out[546]: 
0 VANHOUTEN 
1  OBOYLE 
2  ESTEVAN 
3  RODRIGO 
4  ESTEBAN 
5  OROURKE 
6  RODRIGO 
Name: LastName, dtype: object 
  1. replace("[-']", ' ', regex=True)將所有連字符和冒號空間。

  2. replace(r'^((?:O)|(?:VAN)) ', r'\1', regex=True)在啓動'O''VAN'後刪除空格。

  3. str.split()分割空間

相關問題