Разделить столбец строки панды на основе разделителя переменной длины - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть столбец df.LOCATION, который содержит текстовые строки.Каждая строка содержит текст, отражающий адреса отправителя и получателя.Моя цель - разделить источник и пункт назначения, чтобы я мог создать два отдельных столбца.

В большинстве случаев текст источника и пункта назначения разделяется строковым шаблоном от «до», например, от 1234 A St. до 9876 BСв ".Я использовал

map(lambda x: re.split(' to ', x), df.LOCATION) 

Это прекрасно работает, за исключением того, что в некоторых строках у меня есть больше "to" в тексте, например: "От 1234 A St. нужно до забрать грузовик до 9876 BСв»- в таком случае я все же хотел бы разбить на две строки для источника и места назначения, но мой код выше вернет три списка из-за дополнительной строки «to», которую я выделил жирным шрифтом.

Итак, для решения этой проблемы я реализовал

map(lambda x: re.split(' to \d+', x), dfJobs.LOCATION))

. При этом корректно выполняется поиск строк, в которых есть не только текст «to», но также любые цифры, указывающие на наличие нового адреса послеэто то есть пункт назначения.Это работает, за исключением того, что фактически удаляет эти начальные цифры в адресе назначения, но я хотел бы сохранить их.

Другими словами, я хотел бы обнаружить шаблоны, такие как выше, и когдаони найдены, разделены только по части «до» шаблона.

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Вы можете использовать rsplit и n = 1, чтобы вернуть только один сплит

df[['source', 'destination']] = df.Location.str.rsplit('to', 1, expand = True)

    Location                                        source                              destination
0   1234 A St. to 9876 B St.                        1234 A St.                          9876 B St.
1   From 1234 A St. to pick up truck to 9876 B St.  From 1234 A St. to pick up truck    9876 B St.
0 голосов
/ 17 декабря 2018

Это похоже на проблему с нетерпением.Lookahead позволяет сопоставлять последующие символы, но не использовать их.

>>> re.split(' to (?=\d)', 'From 1234 A St. need to pick up truck to 9876 B St')
['From 1234 A St. need to pick up truck', '9876 B St']
0 голосов
/ 17 декабря 2018
df = pd.DataFrame(
    {'Location' : ['1234 A St. to 9876 B St.', 
                   'From 1234 A St. to pick up truck to 9876 B St.']})    
df
                                         Location
0                        1234 A St. to 9876 B St.
1  From 1234 A St. to pick up truck to 9876 B St.

Вы можете начать сопоставление от "до" до первой цифры, используя r' to\D+'.Для векторизации используйте str.split.

v = df.Location.str.split(r' to\D+', expand=True)
v.columns = ['source', 'destination'] 

df.join(v)
                                         Location           source destination
0                        1234 A St. to 9876 B St.       1234 A St.  9876 B St.
1  From 1234 A St. to pick up truck to 9876 B St.  From 1234 A St.  9876 B St.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...