Как извлечь строку из фрейма данных после сопоставления с регулярным выражением - PullRequest
0 голосов
/ 12 мая 2018

Хотите извлечь название города из адреса, который указан после почтового индекса в кадре данных pandas. Дано: 10 rue des Treuils BP 12 33023, Bordeaux France Я хочу извлечь Bordeaux из столбца данных.

Название города всегда стоит после запятой, но оно не обязательно должно быть одним словом. Необходимо убрать название страны, которая будет иметь фиксированную строку, например, Франция, Италия и т. Д.

Больше примеров французских названий городов

  • Les Deux Alpes

  • Валь дизер

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

Да, может быть, некоторые продвинутые регулярные выражения могли бы справиться с этим, но наивный подход панд был бы:

import pandas as pd
import numpy as np

col = pd.Series(['10 rue des Treuils BP 12 33023, Bordeaux France',
                 '10 rue des Treuils BP 12 33023, Les Deux Alpes France',
                 '10 rue des Treuils BP 12 33023, New York United States'])

cities = np.where(col.str.endswith('United States'), 
                  col.str.split(', ').str[1].str.split().str[:-2].str.join(' '), 
                  col.str.split(', ').str[1].str.split().str[:-1].str.join(' '))

print(cities)
#['Bordeaux' 'Les Deux Alpes' 'New York']

Более общее, но не столь эффективное решение (но кому нужна скоростьверно?)

import pandas as pd

col = pd.Series(['10 rue des Treuils BP 12 33023, Bordeaux France',
                 '10 rue des Treuils BP 12 33023, New York United States',
                 '10 rue des Treuils BP 12 33023, Seoul South Korea',
                 '10 rue des Treuils BP 12 33023, Brazzaville Republic of Congo'])

countries = {'United States': 2 , 'South Korea': 2, 'Republic of Congo': 3}
n = [next((countries[k] for k,v in countries.items() if i.endswith(k)), 1) for i in col]
cities = [' '.join(i.split(', ')[1].split()[:-y]) for i,y in zip(col,n)]

print(cities)
# ['Bordeaux', 'Les Deux Alpes', 'New York', 'Seoul', 'Brazzaville']

А затем просто назначьте обратно с помощью:

df['city'] = cities
0 голосов
/ 12 мая 2018

В Соединенных Штатах будет фиксированная строка, которая может быть удалена как при точном совпадении


Мое решение - удалить название страны, что оставляет нам только название города .
Этот подход кажется более простым, поскольку названия стран являются фиксированными и могут быть легко удалены на основе list, то есть:

  1. split() адрес в два на основе запятая (,);
  2. replace() название страны с nothing;
  3. Используйте panda apply(), чтобы применить get_city() функцию, содержащую шаги, описанные выше.
  4. Используйте panda tolist(), чтобы преобразовать столбец City в список.Этот последний шаг не является обязательным, поскольку он зависит от того, что вы будете делать с названиями городов.

, т. Е.

import pandas as pd
addresses = [['10 rue des Treuils BP 12 33023, Bordeaux France'],['Rua da Alegria 22, Lisboa Portugal'],['22 Some Street, NYC United States']]
df = pd.DataFrame(addresses,columns=['Address'])

countries = ['Portugal', 'France', 'United States']

def get_city(address):
    city_country = address.split(",")[1]
    for i in countries: city = city_country.replace(i, "")
    return city.strip()

df['City'] = df['Address'].apply(get_city)
print (df['City'].tolist())

Вывод :

['Bordeaux', 'Lisboa', 'NYC']

PS: Вы можете lower() указать список адресов и стран, чтобы избежать несоответствия регистра SenSitIve .

0 голосов
/ 12 мая 2018

Если мы считаем, что ваше регулярное выражение работает с французскими адресами (оканчивается на Францию), то вы можете использовать это:

/,\s([A-Z][A-Za-z\s-]+)\sFrance/gm

enter image description here

Ссылка на онлайн-симулятор регулярных выражений, где я тестировал выражение

Вы упомянули ранее о Соединенных Штатах, но на самом деле способ написания адресов совершенно другой, поэтому вам придется сделать другоеЯ полагаю, для этого(то есть: 4 Cross Lane Schererville, IN 46375)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...