在Python的数据框行中提取正则表达式匹配项而不是组

时间:2019-04-22 16:45:24

标签: python regex pandas

我是编码新手,我通常使用R来表示(字符串),但是我也开始学习Python的语法。

我有一个数据框,其中的一列是从导入的excel文件生成的。此列中的值包含大写和小写字符,符号和数字。

我想根据正则表达式模式在数据框中生成仅包含第一列中包含的某些单词的第二列。

df = pd.DataFrame(["THIS IS A TEST 123123. s.m.", "THIS IS A Test test 123 .s.c.e", "TESTING T'TEST 123 da."],columns=['Test'])

df

现在,要提取我想要的内容(大写形式的单词),我通常会使用R:

df <- str_extract_all(df$Test, "\\b[A-Z]{1,}\\b", simplify = FALSE)

提取不同数据帧行中正则表达式的匹配项,这些行是:

* THIS IS A TEST
* THIS IS A
* TESTING T TEST

我找不到适用于Python的类似解决方案,而最接近的是:

df["Name"] = df["Test"].str.extract(r"(\b[A-Z]{1,}\b)", expand = True)

不幸的是,这不起作用,因为它仅导出正则表达式的 groups ,而不是 matches 。我尝试了多种策略,但是str.extractall似乎不起作用(“ TypeError:插入的列与框架索引的索引不兼容)

如何使用Python提取所需的信息?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果我理解得很好,您可以尝试:

df["Name"] = df["Test"].str.extractall(r"(\b[A-Z]{1,}\b)")
                       .unstack().fillna('').apply(' '.join, 1)

[编辑]: 这是我通过查看文档发现的较短版本:

 df["Name"] = df["Test"].str.extractall(r"(\b[A-Z]{1,}\b)").unstack(fill_value='').apply(' '.join, 1)

答案 1 :(得分:1)

您正在正确地获得图案。此解决方案使用正则表达式,联接和映射。

 df['Name'] = df['Test'].map(lambda x: ' '.join(re.findall(r"\b[A-Z\s]+\b", x)))

结果:

  Test  Name
0   THIS IS A TEST 123123. s.m.     THIS IS A TEST
1   THIS IS A Test test 123 .s.c.e  THIS IS A
2   TESTING T'TEST 123 da.          TESTING T TEST