Как извлечь день месяца с помощью регулярного выражения в Pandas? - PullRequest
0 голосов
/ 06 августа 2020

У меня есть строки внутри такого фрейма данных

140 "14 Feb 1995 Primary Care Doctor:
"
141 "30 May 2016 SOS-10 Total Score:
"
142 "22 January 1996 @ 11 AMCommunication with referring physician?: Done
"

И я хочу извлекать дни и месяцы отдельно. Итак, я составил список

list=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']        
for i in range(500):
     
    for month in list:
       a= 'r(\d\d) '+month+'[a-z]{,8}'
       b=df[0].str.findall(a)[i]
       df['day'][i]=b

Когда я ищу df ['day'], я получаю только [], и я хотел бы получить [14] [30] [22]

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Попробуйте использовать это регулярное выражение:

...
    a = r"(\d{1,2}) \w+ \d{4}"
    b = df[0].str.findall(a)[i]
    df['day'][i] = b
0 голосов
/ 06 августа 2020

Попробуйте этот шаблон:

pattern = re.compile(r"(?P<day>\d{1,2}) (?P<month>[A-Z][a-z]{2,}) (?P<year>\d{2,4})")

Именованные группы захвата, например (?P<day> \d{0,2}, означают, что вы можете получить доступ к 3-кортежу, который возвращается, и извлечь только это поле.

Затем вы может сделать что-то вроде этого:

>>> for match in re.finditer(pattern, str):
>>> .... print(match.group("day"))

Я бы также использовал apply вместо l oop для доступа к вашему DataFrame:

>>> data = {"string": ["14 Feb 1995 Primary Care Doctor:", 
       "30 May 2016 SOS-10 Total Score:",
        "22 January 1996 @ 11 AMCommunication with referring physician?: Done"] }

>>> df = pd.DataFrame.from_dict(data)

>>> df.string.apply(lambda x: re.search(pattern, x).group("day"))

0    14
1    30
2    22
Name: string, dtype: object

Тогда вы можете удобно сохранить эти значения отдельно, если вы хотите:

>>> df["day"] = df.string.apply(lambda x: re.search(pattern, x).group("day"))

>>> df["month"] = df.string.apply(lambda x: re.search(pattern, x).group("month"))

>>> df
    string                                              day month
0   14 Feb 1995 Primary Care Doctor:                    14  Feb
1   30 May 2016 SOS-10 Total Score:                     30  May
2   22 January 1996 @ 11 AMCommunication with refe...   22  January

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

pattern = re.compile(r"(?P<day>\d{1,2}) (?P<month>[A-Z][a-z]{2})[a-z]*? (?P<year>\d{2,4})")

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

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