Извлечение совпадений регулярных выражений, а не групп, в строках фреймов данных в Python - PullRequest
1 голос
/ 22 апреля 2019

Я новичок в кодировании, и я обычно использую R для этого (stringr), но я начал изучать и синтаксис Python.

У меня есть фрейм данных с одним столбцом, сгенерированным из импортированного файла Excel.Значения в этом столбце содержат как прописные, так и строчные буквы, символы и цифры.

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

df = pd.DataFrame(["THIS IS A TEST 123123. s.m.", "THIS IS A Test test 123 .s.c.e", "TESTING T'TEST 123 da."],columns=['Test'])

df

Теперь, чтобы извлечь то, что я хочу (слова в заглавном регистре), в RI обычно используется:

df <- str_extract_all(df$Test, "\\b[A-Z]{1,}\\b", simplify = FALSE)

, чтобы извлечь совпадения регулярного выражения в разных данных.строки кадра:

* THIS IS A TEST
* THIS IS A
* TESTING T TEST

Я не смог найти аналогичное решение для Python, и самое близкое, что я должен сделать, это следующее:

df["Name"] = df["Test"].str.extract(r"(\b[A-Z]{1,}\b)", expand = True)

К сожалению, это делаетне работает, так как он экспортирует только группы , а не соответствует регулярного выражения.Я перепробовал несколько стратегий, но также str.extractall не работает («TypeError: несовместимый индекс вставленного столбца с индексом фрейма)

Как извлечь нужную информацию с помощью Python?

Спасибо!

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Вы на правильном пути получения шаблона. Это решение использует регулярное выражение, объединение и отображение.

 df['Name'] = df['Test'].map(lambda x: ' '.join(re.findall(r"\b[A-Z\s]+\b", x)))

Результат:

  Test  Name
0   THIS IS A TEST 123123. s.m.     THIS IS A TEST
1   THIS IS A Test test 123 .s.c.e  THIS IS A
2   TESTING T'TEST 123 da.          TESTING T TEST
1 голос
/ 22 апреля 2019

Если я хорошо понимаю, вы можете попробовать:

df["Name"] = df["Test"].str.extractall(r"(\b[A-Z]{1,}\b)")
                       .unstack().fillna('').apply(' '.join, 1)

[РЕДАКТИРОВАТЬ]: Вот более короткая версия, которую я обнаружил, глядя на документ:

 df["Name"] = df["Test"].str.extractall(r"(\b[A-Z]{1,}\b)").unstack(fill_value='').apply(' '.join, 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...