Примените регулярное выражение к фрейму данных pandas к каждому элементу в iteritem и верните только первую часть - PullRequest
0 голосов
/ 16 января 2019

У меня есть текстовый файл с названием штатов и университетов. Я прочитал его в dataframe с помощью pandas.read_table (). Затем я выполняю его с помощью iterrows (), и по каждому пункту я хотел бы получить только штат и университет. Состояния могут быть обнаружены с помощью суффикса [edit]. Затем университеты следуют в других строках, пока не появится следующий штат. Что означает другое имя, за которым следует «[править]». Вид информационного кадра показан ниже:

enter image description here

Как показано, Алабама в строке 0 является государством. Университеты в рядах с 1 по 8 принадлежат Алабаме, пока не появится строка 9, которая является другим штатом. Ряд 10 принадлежит государству в ряду 9, Аляска. Весь фрейм данных имеет такую ​​структуру. Я пытаюсь очистить его и вернуть еще один фрейм данных с такой структурой: один столбец с именами штатов и университетов вместе, но без частей после [] и (). Тогда это будет выглядеть следующим образом:

Alabama

Auburn

Флоренция

Джексонвилл

У некоторых записей есть "." или пробел в их именах. Я написал следующее регулярное выражение, чтобы получить их, но в результате я получаю «edit», «Auburn University» и т.д. Другими словами, он возвращает все, что соответствует, а не только первую часть.

Код выглядит следующим образом: я прочитал текстовый файл в фрейм данных с именем df_university_town. Затем я применил регулярное выражение следующим образом:

import re
pattern = re.compile(r'([a-zA-Z]+[\.\s]?[a-zA-Z]+)(\w?)')
for key, item in df_university_town.iteritems():
    matches = pattern.finditer(str(item))
    for match in matches:
        print(match.group(1))

И вот результат, который я получаю:

enter image description here

Как видите, «редактировать» и «Обернский университет» в конечном результате являются дополнительными. Я использовал другой подход и попробовал match (), но это также не помогло. В основном, когда я достигаю «[» или «(», поиск не должен продолжаться. Я не знаю, что еще мне нужно сделать. Я ценю любую помощь или предложения.

Большое спасибо за вашу помощь и время, которое вы уделяете этому.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Если вам нужно захватить все до этих символов, используйте .str.split. Регулярное выражение допускает использование необязательного символа пробела перед ( или [, поэтому вам не нужно удалять его позже.

df.RegStatName.str.split('(\s?\(|\s?\[)').str[0]

0      Alabama
1       Auburn
2     Florence
3       Alaska
4    Fairbanks
5      Arizona
6      Nothing
7         This
Name: RegStatName, dtype: object

Пример данных: df

                                     RegStatName
0                                  Alabama[edit]
1                  Auburn (Auburn University)[1]
2         Florence (University of NOrth Alabama)
3                                   Alaska[edit]
4  Fairbanks (University of Alaska Fairbanks)[2]
5                                  Arizona[edit]
6                                        Nothing
7                               This [something]
0 голосов
/ 16 января 2019

Вы можете попробовать это:

([^\(\)\[\]\n\r]+)(?![^\[\(]*?[\]\)])

Это выглядит просто, но, похоже, работает с вашим набором образцов, как вы можете видеть здесь: https://regex101.com/r/jBSeqQ/2

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

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