Как использовать регулярные выражения с pandas.Series.str.replace () - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь заменить определенные части строки методом pandas.Series.str.replace (), используя regex для определения частей, которые я хочу изменить, в соответствии с документами, которые вы можете использовать регулярными выражениями и даже re.компилировать объекты.Я просто не могу понять, что я делаю неправильно, но мне кажется, что я стираю полностью, а не заменяю части строки.

Итак, в моем DataFrame, скажем, у меня есть столбец с именем ['date'], который отформатирован следующим образом:

'2016-03-26 17:47:46'

Я просто хочу получить тире, пространство и время(оставляя 8 цифр в качестве даты) - затем замените их на '', надеюсь, оставив 20160326, поэтому я создаю объект re.compile, который захватывает их:

re_express = re.compile('[\d]{4}(.)[\d]{2}(.)[\d]{2}(.*)')

Затем я пытаюсь заменить их следующей строкой:

df['date'] = df['date'].str.replace(re_express,'')

К сожалению, это просто полностью удаляет дату, оставляя '' в моем столбце ['date'].Эти объекты re.compile принимаются в соответствии с документами, если бы я использовал re.findall (), тогда эта строка регулярного выражения захватила бы части, которые я хочу с этой даты, поэтому я могу только предположить, что я не могу использовать их таким же образом в этом методе.Есть ли какие-то настройки, которые я могу сделать, чтобы сделать эту работу?

1 Ответ

0 голосов
/ 23 октября 2018

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

import pandas as pd
df = pd.DataFrame({'date':['2016-03-26 17:47:46', '2018-03-26 17:47:46']})
re_express = re.compile('([\d]{4}).([\d]{2}).([\d]{2}).*')
df['date'] = df['date'].str.replace(re_express, r'\1\2\3')

Обратите внимание на часть r'\1\2\3', которая относится к первому, второму и третьемусоответственно, группа захвата, которая (используя измененный шаблон) относится именно к интересующим вас значениям. Если строки могут когда-либо содержать дефисы только между компонентами даты, то я бы рекомендовал сопоставить именно это (-), а не любоесимвол (.).


Если вы действительно хотите придерживаться подхода «сопоставить и удалить», вы можете написать регулярное выражение, чтобы поймать «дефис» или что-нибудь, начиная сс пробелом ":

re_express = re.compile('-| .*')
df['date'] = df['date'].str.replace(re_express, '')

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

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