在一列中匹配多个正则表达式(并列出匹配项)

时间:2019-06-17 18:43:26

标签: python regex python-3.x pandas dataframe

我想知道正则表达式匹配多少个项目/文档。最终结果应类似于以下格式:

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

如何连接(在R中等效于大熊猫rbind)数据行?这样我就可以使数据看起来像对象“最终”了?

我尝试了pd.concat([g1,g2], axis=0),但是通过使用concat得到了以下错误消息:cannot concatenate a non-NDFrame object

1 个答案:

答案 0 :(得分:1)

循环使用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