Используйте другой столбец pandas для указания регулярного выражения в Series.contains - PullRequest
3 голосов
/ 10 февраля 2020

У меня есть фрейм данных с длинным текстовым полем и короткой строкой, которая по сути является категорией. Моя цель - использовать регулярное выражение для создания нового столбца в кадре данных, соответствующего тому, есть ли совпадение. Регулярное выражение обусловлено категорией. Вот пример:

a = ['the dog is mad and sad 50', 'the cat is happy']
b = ['dog', 'cat']
regex = ['[0-9]{2}', '[0-9]{3}']

ab = pd.DataFrame(zip(a,b,regex), columns = ['text', 'category', 'pattern'])

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

Однако, когда я запускаю следующее, я получаю сообщение об ошибке

ab['match'] = np.where(ab[ab['text'].str.contains(ab['pattern'], regex = True)], 1, 0)

TypeError: 'Series' objects are mutable, thus they cannot be hashed

Фрейм данных очень большой и потенциально много категорий, поэтому Векторизованное решение, подобное приведенному выше, было бы предпочтительным.

1 Ответ

3 голосов
/ 10 февраля 2020

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

import re

ab['match'] = ab.apply(lambda row: bool(re.search(row['pattern'], row['text'])), axis=1)

                        text category   pattern  match
0  the dog is mad and sad 50      dog  [0-9]{2}   True
1           the cat is happy      cat  [0-9]{3}  False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...