Сравнение нескольких регулярных выражений с одним столбцом (и табулирование совпадений) - PullRequest
1 голос
/ 17 июня 2019

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

data = [['Regular Expression 1', 10], ['Regular Expression 2', 15]]
final = pd.DataFrame(data, columns = ['Regular Expression', 'Count']) 

Вот пример набора данных текстовых документов

foo = pd.DataFrame({'a' : [1,2,3,4,5], 
                    'b' : ['hi whatever something',
                           'foo', 'fat a a a foo', 'cat', 'fat']})

вот регулярные выражения, которые подсчитывают данные

g1 = foo['b'][foo['b'].str.contains(r'(?=.*foo)(?=.*fat)|(\bwhatever\b)',regex=True)].count()
g2 = foo['b'][foo['b'].str.contains(r'\bfat\W+(?:\w+\W+){0,5}?foo\b',regex=True)].count()
g1  # 2 
g2  # 1

Как объединить (эквивалент панды rbind в R) строки данных? Таким образом, я могу получить данные в виде объекта "Финал"?

Я пытался pd.concat([g1,g2], axis=0), но я получаю это сообщение об ошибке при использовании concat: cannot concatenate a non-NDFrame object

1 Ответ

1 голос
/ 17 июня 2019

Используйте str.contains в цикле, затем concat результаты и вызовите sum:

R = [r'(?=.*foo)(?=.*fat)|(\bwhatever\b)', r'\bfat\W+(?:\w+\W+){0,5}?foo\b']
df = pd.concat({r: foo['b'].str.contains(r) for r in R}, axis=1)

df.sum().rename_axis('regex').reset_index(name='count')

                               regex  count
0  (?=.*foo)(?=.*fat)|(\bwhatever\b)      2
1      \bfat\W+(?:\w+\W+){0,5}?foo\b      1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...