Python - заменить строки во фрейме данных - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь заменить некоторые адреса на французском языке в кадре данных.Я использую список и регулярные выражения и один список.

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 голосов
/ 23 ноября 2018

Следующее решение может не работать для определенных случаев.Поскольку в конце адреса указан почтовый индекс или город, который вы не знаете, я думаю, что одним из способов может быть поиск:

  1. строки с цифрами в начале '[0-9]+':все адреса начинаются с цифры
  2. некоторые символы (.*): например, чтобы поймать -102
  3. любое слово из liste_adresses, используя '|'.join(liste_adresses)
  4. почтовый индексиз 5 цифр [0-9]{5}
  5. ищите название города, если оно существует с ([^\.|\n]{0,2}[A-Z][a-z]*)*: здесь я предполагаю, что если после почтового индекса есть точка или новая строка, то адрес закончился, поэтому сопоставьтеот 0 до 2 символов, но не точка или новая строка [^\.|\n]{0,2}, затем одна заглавная буква [A-Z], затем любая строчная буква [a-z]* до конца слова, дополнительная буква в конце * будет захватывать города, составленныедвух слов, таких как Сен-Дени.

Так во всем мире, делая:

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...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...