簡體   English   中英

Python-替換數據框中的字符串

[英]Python - Replace strings in a data frame

我正在嘗試在數據框中替換法語中的一些地址。 我正在使用一個列表,正則表達式和一個列表。

def adresses(df):  

    liste_adresses = ['allée', 'Allée', 'rue', 'Rue', 'avenue', 'Avenue', 'av', 'AV', 'boulevard', 'Boulevard', 'bd', 'Bd', 'carreau', 'Carreau', 'carrefour', 'Carrefour', 'place', 'Place', 'voie', 'Voie', 'villa', 'Villa', 'route', 'Route', 'quai', 'Quai']

    for i in liste_adresses:

        df['C'] = df['C'].str.replace(r'[0-9]+(,|\s+)i\s+\w+\s+(\w+)?(\s+)?(\w+)?(\s+)?([0-9]{5})?(\s+)?\w+?([0-9]{5})?','<address>')

return df

我的數據框:

       A          B                                                                C
  French      house                      I live in 15 rue Louis Philippe 75001 Neuilly
 English      house               my address: 101-102 bd Charles de Gaulle 75001 Paris
  French  apartment                                                    my name is Liam
  French      house                                                       Hello George!
 English  apartment  This is wrong: 4, rue Ledion Paris 75014 and I'm not happy with it

在我的輸出中,什么都沒有發生。

好的輸出:

       A          B                         C
  French      house                                I live in <address>
 English      house                              my address: <address>
  French  apartment                                    my name is Liam
  French      house                                       Hello George!
 English  apartment  This is wrong: <address> and I'm not happy with it

以下解決方案可能不適用於特定情況。 由於地址的結尾是郵政編碼或您所不知道的城市,我認為一種方法可能是尋找:

  1. 字符串開頭為'[0-9]+' :所有地址均以數字開頭
  2. 一些字符(.*) :例如捕獲-102
  3. liste_adresses任何單詞liste_adresses使用'|'.join(liste_adresses)
  4. 5位數的郵政編碼[0-9]{5}
  5. 尋找城市名稱(如果存在的話([^\\.|\\n]{0,2}[AZ][az]*)* :在這里,我假設郵政編碼后是否有點或新行,那么地址就結束了,因此請匹配0到2個字符,但不能匹配點或換行[^\\.|\\n]{0,2} ,然后是一個大寫字母[AZ]然后是任何小寫[az]*直到單詞的末尾,末尾*的多余部分會覆蓋由兩個單詞組成的城市,例如聖丹尼斯。

因此,在全球范圍內:

liste_adresses = ['allée', 'Allée', 'rue', 'Rue', 'avenue', 'Avenue', 'av', 'AV',
                  'boulevard', 'Boulevard', 'bd', 'Bd', 'carreau', 'Carreau',
                  'carrefour', 'Carrefour', 'place', 'Place', 'voie', 'Voie',
                  'villa', 'Villa', 'route', 'Route', 'quai', 'Quai']

reg = r'[0-9]+(.*)('+'|'.join(liste_adresses) + ')(.*)[0-9]{5}([^\.|\n]{0,2}[A-Z][a-z]*)*'

print (df['C'].str.replace(reg,'<address>'))
0                                  I live in <address>
1                                my address: <address>
2                                      my name is Liam
3                                        Hello George!
4    This is wrong: <address> and I'm not happy wit...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM