Как я могу разделить столбец строки pandas, используя разные ключевые слова?

#regex #pandas #split

#регулярное выражение #pandas #разделить

Вопрос:

Мне нужно разделить столбец (часть фрейма данных pandas) на столбцы, описанные в ячейке. Я пробовал с помощью split(«:»), но он разбивается там, где есть часы. Какие-либо предложения, пожалуйста? Я хочу исходить из этого: введите описание изображения здесь

 DOSE: 20 mg - ROUTE: oral  (morning) - START: 01/Jan/20 15:39:00
 

к этому:
введите описание изображения здесь

 Dose     Route           Start                 Stop
20 mg    oral(morning)  01/jan/20  15:39:00    01/07/2020  15:39:00
 

Ответ №1:

Вы можете использовать

 >>> import pandas as pd
>>> pattern = r"^DOSE:s*(?P<Dose>.*?)W ROUTE:s*(?P<Route>.*?)W START:s*(?P<Start>.*?)(?:W STOP:s*(?P<Stop>.*)|$)"
>>> df = pd.DataFrame({'Description':["DOSE: 20 mg - ROUTE: oral  (morning) - START: 01/Jan/20 15:39:00", "DOSE: 20 mg - ROUTE: oral  (morning) - START: 01/Jan/20 15:39:00 STOP: 05/Feb/20 12:33:45"]})
>>> df["Description"].str.extract(pattern).fillna("")
    Dose           Route               Start                Stop
0  20 mg  oral  (morning  01/Jan/20 15:39:00                    
1  20 mg  oral  (morning  01/Jan/20 15:39:00  05/Feb/20 12:33:45
 

Посмотрите демонстрацию регулярных выражений.

Подробные сведения

  • ^ — начало строки
  • DOSE: — буквальный текст
  • s* — 0 пробелов
  • (?P<Dose>.*?) — Групповая «Доза»: любые нулевые или более символов, как можно меньше
  • W — один или несколько символов, не содержащих слов
  • ROUTE:s* ROUTE: и ноль или более пробелов
  • (?P<Route>.*?) — Групповой «маршрут»: любые нулевые или более символов, как можно меньше
  • W START:s* — один или несколько символов, не содержащих слов, START: и ноль или более пробелов
  • (?P<Start>.*?) — Группа «Начало»: любые нулевые или более символов, как можно меньше
  • (?:W STOP:s*(?P<Stop>.*)|$) — либо
    • W STOP:s*(?P<Stop>.*) — один или несколько символов, не содержащих слов STOP: , и ноль или более пробелов, а затем группа «Stop» захватывает любые нулевые или более символов, как можно меньше
    • | — или
    • $ — конец строки.