Разделение столбца в Pandas с помощью регулярных выражений - PullRequest
1 голос
/ 25 февраля 2020

Мой первый вопрос ... У меня есть Pandas фрейм данных с колонкой 'Description'. Столбец имеет ссылку и имя, которое я хочу разделить на два столбца. У меня есть 'Names' в отдельном df:

#  Description                                   #  Names
---------------------------------------          ---------------
0  A long walk by Miss D'Bus                     0  Teresa Green
1  A day in the country by Teresa Green          1  Tim Burr
2  Falling Trees by Tim Burr                     2  Miss D'Bus
3  Evergreens by Teresa Green
4  Late for Dinner by Miss D'Bus

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

regex = '$|'.join(map(re.escape, df['Names'])) + '$' 
df['Reference'] = df['Description'].str.split(regex, expand=True)

чтобы получить

#  Description                                   Reference
-----------------------------------------------------------------------
0  A long walk by Miss D'Bus                     A long walk by
1  A day in the country by Teresa Green          A day in the country by
2  Falling Trees by Tim Burr                     Falling Trees by
3  Evergreens by Teresa Green                    Evergreens by
4  Late for Dinner by Miss D'Bus                 Late for Dinner by

Но я хочу, чтобы соответствующее (= удаленный разделитель) Name было добавлено в качестве дополнительного столбца.

Попытка добавления *? к регулярному выражению типа this

Я попытался разбить столбец «Описание» с помощью столбца «Справочник»

df['Name'] = df['Description'].str.split(df['Reference'])

Я попытался нарезать столбец «Описание» с помощью используя длину строки 'Reference', например

# like: df['Name'] = df['Description'].str[-10:]
df['Name'] = df['Description'].str[-(df['Reference'].str.len()):]

, но я получаю постоянную длину среза.

1 Ответ

2 голосов
/ 25 февраля 2020

Вы можете использовать Series.str.extract для получения обоих типов информации из исходного столбца:

regex = r'^(.*?)\s*({})$'.format('|'.join(map(re.escape, df['Names'])))
df[['Reference','Name']] = df['Description'].str.extract(regex, expand=True)

Вывод:

>>> df
                            Description                Reference          name
0             A long walk by Miss D'Bus           A long walk by    Miss D'Bus
1  A day in the country by Teresa Green  A day in the country by  Teresa Green
2             Falling Trees by Tim Burr         Falling Trees by      Tim Burr
3            Evergreens by Teresa Green            Evergreens by  Teresa Green
4         Late for Dinner by Miss D'Bus       Late for Dinner by    Miss D'Bus

Регулярное выражение будет выглядеть как ^(.*?)\s*(Teresa\ Green|Tim\ Burr|Miss\ D\'Bus)$:

  • ^ - начало строки
  • (.*?) - Группа 1 («Ссылка»): любой ноль или более символов, кроме символов разрыва строки, как можно меньше
  • \s* - 0+ пробелов
  • (Teresa\ Green|Tim\ Burr|Miss\ D\'Bus) - Группа 2 («Имя»): группа альтернатив с известными именами
  • $ - конец строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...